[ADT] Migrate StringSwitch Cases with 6+ arguments to new overload. NFC. (#163549)

Switch to the `.Cases({S0, S1, ...}, Value)` overload instead, and the
manually-enumerated overloads with 6+ arguments are getting deprecated
in https://github.com/llvm/llvm-project/pull/163405.

This pre-commits API updates ahead of the deprecation to make potential
reverts cleaner. This was already reviewed in #163405.
This commit is contained in:
Jakub Kuderski 2025-10-15 09:27:37 -04:00 committed by GitHub
parent bfee9db785
commit 2ed7baafc3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 276 additions and 246 deletions

View File

@ -140,8 +140,8 @@ public:
// It might be great to reuse FrontendOptions::getInputKindForExtension()
// but for now it doesn't discriminate between code and header files.
return llvm::StringSwitch<bool>(SM.getFilename(SL).rsplit('.').second)
.Cases("c", "m", "mm", "C", "cc", "cp", true)
.Cases("cpp", "CPP", "c++", "cxx", "cppm", true)
.Cases({"c", "m", "mm", "C", "cc", "cp"}, true)
.Cases({"cpp", "CPP", "c++", "cxx", "cppm"}, true)
.Default(false);
}

View File

@ -420,23 +420,23 @@ static MCUInfo AVRMcus[] = {
static bool ArchHasELPM(StringRef Arch) {
return llvm::StringSwitch<bool>(Arch)
.Cases("31", "51", "6", true)
.Cases("102", "104", "105", "106", "107", true)
.Default(false);
.Cases({"31", "51", "6"}, true)
.Cases({"102", "104", "105", "106", "107"}, true)
.Default(false);
}
static bool ArchHasELPMX(StringRef Arch) {
return llvm::StringSwitch<bool>(Arch)
.Cases("51", "6", true)
.Cases("102", "104", "105", "106", "107", true)
.Default(false);
.Cases({"51", "6"}, true)
.Cases({"102", "104", "105", "106", "107"}, true)
.Default(false);
}
static bool ArchHasMOVW(StringRef Arch) {
return llvm::StringSwitch<bool>(Arch)
.Cases("25", "35", "4", "5", "51", "6", true)
.Cases("102", "103", "104", "105", "106", "107", true)
.Default(false);
.Cases({"25", "35", "4", "5", "51", "6"}, true)
.Cases({"102", "103", "104", "105", "106", "107"}, true)
.Default(false);
}
static bool ArchHasLPMX(StringRef Arch) {
@ -445,16 +445,16 @@ static bool ArchHasLPMX(StringRef Arch) {
static bool ArchHasMUL(StringRef Arch) {
return llvm::StringSwitch<bool>(Arch)
.Cases("4", "5", "51", "6", true)
.Cases("102", "103", "104", "105", "106", "107", true)
.Default(false);
.Cases({"4", "5", "51", "6"}, true)
.Cases({"102", "103", "104", "105", "106", "107"}, true)
.Default(false);
}
static bool ArchHasJMPCALL(StringRef Arch) {
return llvm::StringSwitch<bool>(Arch)
.Cases("3", "31", "35", "5", "51", "6", true)
.Cases("102", "103", "104", "105", "106", "107", true)
.Default(false);
.Cases({"3", "31", "35", "5", "51", "6"}, true)
.Cases({"102", "103", "104", "105", "106", "107"}, true)
.Default(false);
}
static bool ArchHas3BytePC(StringRef Arch) {

View File

@ -57,24 +57,25 @@ static bool skipArgs(const char *Flag, bool HaveCrashVFS, int &SkipNum,
SkipNum = 2;
// These flags are all of the form -Flag <Arg> and are treated as two
// arguments. Therefore, we need to skip the flag and the next argument.
bool ShouldSkip = llvm::StringSwitch<bool>(Flag)
.Cases("-MF", "-MT", "-MQ", "-serialize-diagnostic-file", true)
.Cases("-o", "-dependency-file", true)
.Cases("-fdebug-compilation-dir", "-diagnostic-log-file", true)
.Cases("-dwarf-debug-flags", "-ivfsoverlay", true)
.Default(false);
bool ShouldSkip =
llvm::StringSwitch<bool>(Flag)
.Cases({"-MF", "-MT", "-MQ", "-serialize-diagnostic-file"}, true)
.Cases({"-o", "-dependency-file"}, true)
.Cases({"-fdebug-compilation-dir", "-diagnostic-log-file"}, true)
.Cases({"-dwarf-debug-flags", "-ivfsoverlay"}, true)
.Default(false);
if (ShouldSkip)
return true;
// Some include flags shouldn't be skipped if we have a crash VFS
IsInclude =
llvm::StringSwitch<bool>(Flag)
.Cases("-include", "-header-include-file", true)
.Cases("-idirafter", "-internal-isystem", "-iwithprefix", true)
.Cases("-internal-externc-isystem", "-iprefix", true)
.Cases("-iwithprefixbefore", "-isystem", "-iquote", true)
.Cases("-isysroot", "-I", "-F", "-resource-dir", true)
.Cases("-internal-iframework", "-iframework", "-include-pch", true)
.Cases({"-include", "-header-include-file"}, true)
.Cases({"-idirafter", "-internal-isystem", "-iwithprefix"}, true)
.Cases({"-internal-externc-isystem", "-iprefix"}, true)
.Cases({"-iwithprefixbefore", "-isystem", "-iquote"}, true)
.Cases({"-isysroot", "-I", "-F", "-resource-dir"}, true)
.Cases({"-internal-iframework", "-iframework", "-include-pch"}, true)
.Default(false);
if (IsInclude)
return !HaveCrashVFS;
@ -83,9 +84,9 @@ static bool skipArgs(const char *Flag, bool HaveCrashVFS, int &SkipNum,
// These flags are all of the form -Flag and have no second argument.
ShouldSkip = llvm::StringSwitch<bool>(Flag)
.Cases("-M", "-MM", "-MG", "-MP", "-MD", true)
.Case("-MMD", true)
.Default(false);
.Cases({"-M", "-MM", "-MG", "-MP", "-MD"}, true)
.Case("-MMD", true)
.Default(false);
// Match found.
SkipNum = 1;

View File

@ -105,8 +105,9 @@ XRayArgs::XRayArgs(const ToolChain &TC, const ArgList &Args) {
for (const auto &P : BundleParts) {
// TODO: Automate the generation of the string case table.
auto Valid = llvm::StringSwitch<bool>(P)
.Cases("none", "all", "function", "function-entry",
"function-exit", "custom", true)
.Cases({"none", "all", "function", "function-entry",
"function-exit", "custom"},
true)
.Default(false);
if (!Valid) {

View File

@ -14,25 +14,26 @@ using namespace clang;
InputKind FrontendOptions::getInputKindForExtension(StringRef Extension) {
return llvm::StringSwitch<InputKind>(Extension)
.Cases("ast", "pcm", InputKind(Language::Unknown, InputKind::Precompiled))
.Cases({"ast", "pcm"},
InputKind(Language::Unknown, InputKind::Precompiled))
.Case("c", Language::C)
.Cases("S", "s", Language::Asm)
.Cases({"S", "s"}, Language::Asm)
.Case("i", InputKind(Language::C).getPreprocessed())
.Case("ii", InputKind(Language::CXX).getPreprocessed())
.Case("cui", InputKind(Language::CUDA).getPreprocessed())
.Case("m", Language::ObjC)
.Case("mi", InputKind(Language::ObjC).getPreprocessed())
.Cases("mm", "M", Language::ObjCXX)
.Cases({"mm", "M"}, Language::ObjCXX)
.Case("mii", InputKind(Language::ObjCXX).getPreprocessed())
.Cases("C", "cc", "cp", Language::CXX)
.Cases("cpp", "CPP", "c++", "cxx", "hpp", "hxx", Language::CXX)
.Cases({"C", "cc", "cp"}, Language::CXX)
.Cases({"cpp", "CPP", "c++", "cxx", "hpp", "hxx"}, Language::CXX)
.Case("cppm", Language::CXX)
.Cases("iim", "iih", InputKind(Language::CXX).getPreprocessed())
.Cases({"iim", "iih"}, InputKind(Language::CXX).getPreprocessed())
.Case("cl", Language::OpenCL)
.Case("clcpp", Language::OpenCLCXX)
.Cases("cu", "cuh", Language::CUDA)
.Cases({"cu", "cuh"}, Language::CUDA)
.Case("hip", Language::HIP)
.Cases("ll", "bc", Language::LLVM_IR)
.Cases({"ll", "bc"}, Language::LLVM_IR)
.Case("hlsl", Language::HLSL)
.Case("cir", Language::CIR)
.Default(Language::Unknown);

View File

@ -38,7 +38,7 @@ std::optional<std::string> createIncludeHeaderName(const StringRef FullPath) {
bool isHeaderFile(StringRef Path) {
return StringSwitch<bool>(sys::path::extension(Path))
.Cases(".h", ".H", ".hh", ".hpp", ".hxx", true)
.Cases({".h", ".H", ".hh", ".hpp", ".hxx"}, true)
.Default(false);
}

View File

@ -248,50 +248,67 @@ static bool warnByDefaultOnWrongCase(StringRef Include) {
// The standard C/C++ and Posix headers
return llvm::StringSwitch<bool>(LowerInclude)
// C library headers
.Cases("assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h", true)
.Cases("float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h", true)
.Cases("math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h", true)
.Cases("stdatomic.h", "stdbool.h", "stdckdint.h", "stdcountof.h", true)
.Cases("stddef.h", "stdint.h", "stdio.h", "stdlib.h", "stdnoreturn.h", true)
.Cases("string.h", "tgmath.h", "threads.h", "time.h", "uchar.h", true)
.Cases("wchar.h", "wctype.h", true)
// C library headers
.Cases({"assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h"}, true)
.Cases({"float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h"},
true)
.Cases({"math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h"}, true)
.Cases({"stdatomic.h", "stdbool.h", "stdckdint.h", "stdcountof.h"}, true)
.Cases({"stddef.h", "stdint.h", "stdio.h", "stdlib.h", "stdnoreturn.h"},
true)
.Cases({"string.h", "tgmath.h", "threads.h", "time.h", "uchar.h"}, true)
.Cases({"wchar.h", "wctype.h"}, true)
// C++ headers for C library facilities
.Cases("cassert", "ccomplex", "cctype", "cerrno", "cfenv", true)
.Cases("cfloat", "cinttypes", "ciso646", "climits", "clocale", true)
.Cases("cmath", "csetjmp", "csignal", "cstdalign", "cstdarg", true)
.Cases("cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib", true)
.Cases("cstring", "ctgmath", "ctime", "cuchar", "cwchar", true)
.Case("cwctype", true)
// C++ headers for C library facilities
.Cases({"cassert", "ccomplex", "cctype", "cerrno", "cfenv"}, true)
.Cases({"cfloat", "cinttypes", "ciso646", "climits", "clocale"}, true)
.Cases({"cmath", "csetjmp", "csignal", "cstdalign", "cstdarg"}, true)
.Cases({"cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib"}, true)
.Cases({"cstring", "ctgmath", "ctime", "cuchar", "cwchar"}, true)
.Case("cwctype", true)
// C++ library headers
.Cases("algorithm", "fstream", "list", "regex", "thread", true)
.Cases("array", "functional", "locale", "scoped_allocator", "tuple", true)
.Cases("atomic", "future", "map", "set", "type_traits", true)
.Cases("bitset", "initializer_list", "memory", "shared_mutex", "typeindex", true)
.Cases("chrono", "iomanip", "mutex", "sstream", "typeinfo", true)
.Cases("codecvt", "ios", "new", "stack", "unordered_map", true)
.Cases("complex", "iosfwd", "numeric", "stdexcept", "unordered_set", true)
.Cases("condition_variable", "iostream", "ostream", "streambuf", "utility", true)
.Cases("deque", "istream", "queue", "string", "valarray", true)
.Cases("exception", "iterator", "random", "strstream", "vector", true)
.Cases("forward_list", "limits", "ratio", "system_error", true)
// C++ library headers
.Cases({"algorithm", "fstream", "list", "regex", "thread"}, true)
.Cases({"array", "functional", "locale", "scoped_allocator", "tuple"},
true)
.Cases({"atomic", "future", "map", "set", "type_traits"}, true)
.Cases(
{"bitset", "initializer_list", "memory", "shared_mutex", "typeindex"},
true)
.Cases({"chrono", "iomanip", "mutex", "sstream", "typeinfo"}, true)
.Cases({"codecvt", "ios", "new", "stack", "unordered_map"}, true)
.Cases({"complex", "iosfwd", "numeric", "stdexcept", "unordered_set"},
true)
.Cases(
{"condition_variable", "iostream", "ostream", "streambuf", "utility"},
true)
.Cases({"deque", "istream", "queue", "string", "valarray"}, true)
.Cases({"exception", "iterator", "random", "strstream", "vector"}, true)
.Cases({"forward_list", "limits", "ratio", "system_error"}, true)
// POSIX headers (which aren't also C headers)
.Cases("aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h", true)
.Cases("fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h", true)
.Cases("grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h", true)
.Cases("mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h", true)
.Cases("netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h", true)
.Cases("regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h", true)
.Cases("strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h", true)
.Cases("sys/resource.h", "sys/select.h", "sys/sem.h", "sys/shm.h", "sys/socket.h", true)
.Cases("sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h", "sys/types.h", true)
.Cases("sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h", true)
.Cases("tar.h", "termios.h", "trace.h", "ulimit.h", true)
.Cases("unistd.h", "utime.h", "utmpx.h", "wordexp.h", true)
.Default(false);
// POSIX headers (which aren't also C headers)
.Cases({"aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h"}, true)
.Cases({"fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h"}, true)
.Cases({"grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h"}, true)
.Cases({"mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h"},
true)
.Cases({"netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h"},
true)
.Cases({"regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h"}, true)
.Cases({"strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h"},
true)
.Cases({"sys/resource.h", "sys/select.h", "sys/sem.h", "sys/shm.h",
"sys/socket.h"},
true)
.Cases({"sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h",
"sys/types.h"},
true)
.Cases(
{"sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h"},
true)
.Cases({"tar.h", "termios.h", "trace.h", "ulimit.h"}, true)
.Cases({"unistd.h", "utime.h", "utmpx.h", "wordexp.h"}, true)
.Default(false);
}
/// Find a similar string in `Candidates`.

View File

@ -361,11 +361,11 @@ static bool shouldTrackImplicitObjectArg(const CXXMethodDecl *Callee) {
if (!Callee->getIdentifier())
return false;
return llvm::StringSwitch<bool>(Callee->getName())
.Cases("begin", "rbegin", "cbegin", "crbegin", true)
.Cases("end", "rend", "cend", "crend", true)
.Cases("c_str", "data", "get", true)
.Cases({"begin", "rbegin", "cbegin", "crbegin"}, true)
.Cases({"end", "rend", "cend", "crend"}, true)
.Cases({"c_str", "data", "get"}, true)
// Map and set types.
.Cases("find", "equal_range", "lower_bound", "upper_bound", true)
.Cases({"find", "equal_range", "lower_bound", "upper_bound"}, true)
.Default(false);
}
if (Callee->getReturnType()->isReferenceType()) {
@ -377,7 +377,7 @@ static bool shouldTrackImplicitObjectArg(const CXXMethodDecl *Callee) {
OO == OverloadedOperatorKind::OO_Star;
}
return llvm::StringSwitch<bool>(Callee->getName())
.Cases("front", "back", "at", "top", "value", true)
.Cases({"front", "back", "at", "top", "value"}, true)
.Default(false);
}
return false;
@ -394,14 +394,14 @@ static bool shouldTrackFirstArgument(const FunctionDecl *FD) {
if (FD->getReturnType()->isPointerType() ||
isRecordWithAttr<PointerAttr>(FD->getReturnType())) {
return llvm::StringSwitch<bool>(FD->getName())
.Cases("begin", "rbegin", "cbegin", "crbegin", true)
.Cases("end", "rend", "cend", "crend", true)
.Cases({"begin", "rbegin", "cbegin", "crbegin"}, true)
.Cases({"end", "rend", "cend", "crend"}, true)
.Case("data", true)
.Default(false);
}
if (FD->getReturnType()->isReferenceType()) {
return llvm::StringSwitch<bool>(FD->getName())
.Cases("get", "any_cast", true)
.Cases({"get", "any_cast"}, true)
.Default(false);
}
return false;

View File

@ -3629,18 +3629,20 @@ static FormatAttrKind getFormatAttrKind(StringRef Format) {
// Check for formats that get handled specially.
.Case("NSString", NSStringFormat)
.Case("CFString", CFStringFormat)
.Cases("gnu_strftime", "strftime", StrftimeFormat)
.Cases({"gnu_strftime", "strftime"}, StrftimeFormat)
// Otherwise, check for supported formats.
.Cases("gnu_scanf", "scanf", "gnu_printf", "printf", "printf0",
"gnu_strfmon", "strfmon", SupportedFormat)
.Cases("cmn_err", "vcmn_err", "zcmn_err", SupportedFormat)
.Cases("kprintf", "syslog", SupportedFormat) // OpenBSD.
.Case("freebsd_kprintf", SupportedFormat) // FreeBSD.
.Cases({"gnu_scanf", "scanf", "gnu_printf", "printf", "printf0",
"gnu_strfmon", "strfmon"},
SupportedFormat)
.Cases({"cmn_err", "vcmn_err", "zcmn_err"}, SupportedFormat)
.Cases({"kprintf", "syslog"}, SupportedFormat) // OpenBSD.
.Case("freebsd_kprintf", SupportedFormat) // FreeBSD.
.Case("os_trace", SupportedFormat)
.Case("os_log", SupportedFormat)
.Cases("gcc_diag", "gcc_cdiag", "gcc_cxxdiag", "gcc_tdiag", IgnoredFormat)
.Cases({"gcc_diag", "gcc_cdiag", "gcc_cxxdiag", "gcc_tdiag"},
IgnoredFormat)
.Default(InvalidFormat);
}

View File

@ -154,15 +154,15 @@ void WalkAST::VisitCallExpr(CallExpr *CE) {
.Case("mkstemp", &WalkAST::checkCall_mkstemp)
.Case("mkdtemp", &WalkAST::checkCall_mkstemp)
.Case("mkstemps", &WalkAST::checkCall_mkstemp)
.Cases("strcpy", "__strcpy_chk", &WalkAST::checkCall_strcpy)
.Cases("strcat", "__strcat_chk", &WalkAST::checkCall_strcat)
.Cases("sprintf", "vsprintf", "scanf", "wscanf", "fscanf", "fwscanf",
"vscanf", "vwscanf", "vfscanf", "vfwscanf",
.Cases({"strcpy", "__strcpy_chk"}, &WalkAST::checkCall_strcpy)
.Cases({"strcat", "__strcat_chk"}, &WalkAST::checkCall_strcat)
.Cases({"sprintf", "vsprintf", "scanf", "wscanf", "fscanf", "fwscanf",
"vscanf", "vwscanf", "vfscanf", "vfwscanf"},
&WalkAST::checkDeprecatedOrUnsafeBufferHandling)
.Cases("sscanf", "swscanf", "vsscanf", "vswscanf", "swprintf",
"snprintf", "vswprintf", "vsnprintf", "memcpy", "memmove",
.Cases({"sscanf", "swscanf", "vsscanf", "vswscanf", "swprintf",
"snprintf", "vswprintf", "vsnprintf", "memcpy", "memmove"},
&WalkAST::checkDeprecatedOrUnsafeBufferHandling)
.Cases("strncpy", "strncat", "memset", "fprintf",
.Cases({"strncpy", "strncat", "memset", "fprintf"},
&WalkAST::checkDeprecatedOrUnsafeBufferHandling)
.Case("drand48", &WalkAST::checkCall_rand)
.Case("erand48", &WalkAST::checkCall_rand)
@ -766,12 +766,14 @@ void WalkAST::checkDeprecatedOrUnsafeBufferHandling(const CallExpr *CE,
int ArgIndex =
llvm::StringSwitch<int>(Name)
.Cases("scanf", "wscanf", "vscanf", "vwscanf", 0)
.Cases("fscanf", "fwscanf", "vfscanf", "vfwscanf", "sscanf",
"swscanf", "vsscanf", "vswscanf", 1)
.Cases("sprintf", "vsprintf", "fprintf", 1)
.Cases("swprintf", "snprintf", "vswprintf", "vsnprintf", "memcpy",
"memmove", "memset", "strncpy", "strncat", DEPR_ONLY)
.Cases({"scanf", "wscanf", "vscanf", "vwscanf"}, 0)
.Cases({"fscanf", "fwscanf", "vfscanf", "vfwscanf", "sscanf",
"swscanf", "vsscanf", "vswscanf"},
1)
.Cases({"sprintf", "vsprintf", "fprintf"}, 1)
.Cases({"swprintf", "snprintf", "vswprintf", "vsnprintf", "memcpy",
"memmove", "memset", "strncpy", "strncat"},
DEPR_ONLY)
.Default(UNKNOWN_CALL);
assert(ArgIndex != UNKNOWN_CALL && "Unsupported function");

View File

@ -597,15 +597,16 @@ bool ABISysV_loongarch::RegisterIsCalleeSaved(const RegisterInfo *reg_info) {
return llvm::StringSwitch<bool>(name)
// integer ABI names
.Cases("ra", "sp", "fp", true)
.Cases("s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", true)
.Cases({"ra", "sp", "fp"}, true)
.Cases({"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9"}, true)
// integer hardware names
.Cases("r1", "r3", "r22", true)
.Cases("r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "31", true)
.Cases({"r1", "r3", "r22"}, true)
.Cases({"r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "31"},
true)
// floating point ABI names
.Cases("fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", is_hw_fp)
.Cases({"fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7"}, is_hw_fp)
// floating point hardware names
.Cases("f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", is_hw_fp)
.Cases({"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"}, is_hw_fp)
.Default(false);
}

View File

@ -783,21 +783,22 @@ bool ABISysV_riscv::RegisterIsCalleeSaved(const RegisterInfo *reg_info) {
bool is_callee_saved =
llvm::StringSwitch<bool>(name)
// integer ABI names
.Cases("ra", "sp", "fp", true)
.Cases("s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9",
.Cases({"ra", "sp", "fp"}, true)
.Cases({"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9"},
true)
.Cases("s10", "s11", true)
.Cases({"s10", "s11"}, true)
// integer hardware names
.Cases("x1", "x2", "x8", "x9", "x18", "x19", "x20", "x21", "x22",
.Cases({"x1", "x2", "x8", "x9", "x18", "x19", "x20", "x21", "x22"},
true)
.Cases("x23", "x24", "x25", "x26", "x27", true)
.Cases({"x23", "x24", "x25", "x26", "x27"}, true)
// floating point ABI names
.Cases("fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7",
.Cases({"fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7"},
is_hw_fp)
.Cases("fs8", "fs9", "fs10", "fs11", is_hw_fp)
.Cases({"fs8", "fs9", "fs10", "fs11"}, is_hw_fp)
// floating point hardware names
.Cases("f8", "f9", "f18", "f19", "f20", "f21", "f22", "f23", is_hw_fp)
.Cases("f24", "f25", "f26", "f27", is_hw_fp)
.Cases({"f8", "f9", "f18", "f19", "f20", "f21", "f22", "f23"},
is_hw_fp)
.Cases({"f24", "f25", "f26", "f27"}, is_hw_fp)
.Default(false);
return is_callee_saved;

View File

@ -929,8 +929,8 @@ bool ABISysV_x86_64::RegisterIsCalleeSaved(const RegisterInfo *reg_info) {
std::string Name = std::string(reg_info->name);
bool IsCalleeSaved =
llvm::StringSwitch<bool>(Name)
.Cases("r12", "r13", "r14", "r15", "rbp", "ebp", "rbx", "ebx", true)
.Cases("rip", "eip", "rsp", "esp", "sp", "fp", "pc", true)
.Cases({"r12", "r13", "r14", "r15", "rbp", "ebp", "rbx", "ebx"}, true)
.Cases({"rip", "eip", "rsp", "esp", "sp", "fp", "pc"}, true)
.Default(false);
return IsCalleeSaved;
}

View File

@ -797,10 +797,11 @@ bool ABIWindows_x86_64::RegisterIsCalleeSaved(const RegisterInfo *reg_info) {
std::string Name = std::string(reg_info->name);
bool IsCalleeSaved =
llvm::StringSwitch<bool>(Name)
.Cases("rbx", "ebx", "rbp", "ebp", "rdi", "edi", "rsi", "esi", true)
.Cases("rsp", "esp", "r12", "r13", "r14", "r15", "sp", "fp", true)
.Cases("xmm6", "xmm7", "xmm8", "xmm9", "xmm10", "xmm11", "xmm12",
"xmm13", "xmm14", "xmm15", true)
.Cases({"rbx", "ebx", "rbp", "ebp", "rdi", "edi", "rsi", "esi"}, true)
.Cases({"rsp", "esp", "r12", "r13", "r14", "r15", "sp", "fp"}, true)
.Cases({"xmm6", "xmm7", "xmm8", "xmm9", "xmm10", "xmm11", "xmm12",
"xmm13", "xmm14", "xmm15"},
true)
.Default(false);
return IsCalleeSaved;
}

View File

@ -112,26 +112,26 @@ StringRef XCOFF::getNameForTracebackTableLanguageId(
XCOFF::CFileCpuId XCOFF::getCpuID(StringRef CPUName) {
StringRef CPU = PPC::normalizeCPUName(CPUName);
return StringSwitch<XCOFF::CFileCpuId>(CPU)
.Cases("generic", "COM", XCOFF::TCPU_COM)
.Cases({"generic", "COM"}, XCOFF::TCPU_COM)
.Case("601", XCOFF::TCPU_601)
.Cases("602", "603", "603e", "603ev", XCOFF::TCPU_603)
.Cases("604", "604e", XCOFF::TCPU_604)
.Cases({"602", "603", "603e", "603ev"}, XCOFF::TCPU_603)
.Cases({"604", "604e"}, XCOFF::TCPU_604)
.Case("620", XCOFF::TCPU_620)
.Case("970", XCOFF::TCPU_970)
.Cases("a2", "g3", "g4", "g5", "e500", XCOFF::TCPU_COM)
.Cases("pwr3", "pwr4", XCOFF::TCPU_COM)
.Cases("pwr5", "PWR5", XCOFF::TCPU_PWR5)
.Cases("pwr5x", "PWR5X", XCOFF::TCPU_PWR5X)
.Cases("pwr6", "PWR6", XCOFF::TCPU_PWR6)
.Cases("pwr6x", "PWR6E", XCOFF::TCPU_PWR6E)
.Cases("pwr7", "PWR7", XCOFF::TCPU_PWR7)
.Cases("pwr8", "PWR8", XCOFF::TCPU_PWR8)
.Cases("pwr9", "PWR9", XCOFF::TCPU_PWR9)
.Cases("pwr10", "PWR10", XCOFF::TCPU_PWR10)
.Cases("ppc", "PPC", "ppc32", "ppc64", XCOFF::TCPU_COM)
.Cases({"a2", "g3", "g4", "g5", "e500"}, XCOFF::TCPU_COM)
.Cases({"pwr3", "pwr4"}, XCOFF::TCPU_COM)
.Cases({"pwr5", "PWR5"}, XCOFF::TCPU_PWR5)
.Cases({"pwr5x", "PWR5X"}, XCOFF::TCPU_PWR5X)
.Cases({"pwr6", "PWR6"}, XCOFF::TCPU_PWR6)
.Cases({"pwr6x", "PWR6E"}, XCOFF::TCPU_PWR6E)
.Cases({"pwr7", "PWR7"}, XCOFF::TCPU_PWR7)
.Cases({"pwr8", "PWR8"}, XCOFF::TCPU_PWR8)
.Cases({"pwr9", "PWR9"}, XCOFF::TCPU_PWR9)
.Cases({"pwr10", "PWR10"}, XCOFF::TCPU_PWR10)
.Cases({"ppc", "PPC", "ppc32", "ppc64"}, XCOFF::TCPU_COM)
.Case("ppc64le", XCOFF::TCPU_PWR8)
.Case("future", XCOFF::TCPU_PWR10)
.Cases("any", "ANY", XCOFF::TCPU_ANY)
.Cases({"any", "ANY"}, XCOFF::TCPU_ANY)
.Default(XCOFF::TCPU_INVALID);
}

View File

@ -3356,10 +3356,10 @@ bool RISCVAsmParser::parseDirectiveAttribute() {
bool isValidInsnFormat(StringRef Format, const MCSubtargetInfo &STI) {
return StringSwitch<bool>(Format)
.Cases("r", "r4", "i", "b", "sb", "u", "j", "uj", "s", true)
.Cases("cr", "ci", "ciw", "css", "cl", "cs", "ca", "cb", "cj",
.Cases({"r", "r4", "i", "b", "sb", "u", "j", "uj", "s"}, true)
.Cases({"cr", "ci", "ciw", "css", "cl", "cs", "ca", "cb", "cj"},
STI.hasFeature(RISCV::FeatureStdExtZca))
.Cases("qc.eai", "qc.ei", "qc.eb", "qc.ej", "qc.es",
.Cases({"qc.eai", "qc.ei", "qc.eb", "qc.ej", "qc.es"},
!STI.hasFeature(RISCV::Feature64Bit))
.Default(false);
}

View File

@ -43,7 +43,7 @@ const llvm::StringRef RISCVLMULInstrument::DESC_NAME = "RISCV-LMUL";
bool RISCVLMULInstrument::isDataValid(llvm::StringRef Data) {
// Return true if not one of the valid LMUL strings
return StringSwitch<bool>(Data)
.Cases("M1", "M2", "M4", "M8", "MF2", "MF4", "MF8", true)
.Cases({"M1", "M2", "M4", "M8", "MF2", "MF4", "MF8"}, true)
.Default(false);
}

View File

@ -23,7 +23,7 @@ std::optional<wasm::ValType> WebAssembly::parseType(StringRef Type) {
.Case("i64", wasm::ValType::I64)
.Case("f32", wasm::ValType::F32)
.Case("f64", wasm::ValType::F64)
.Cases("v128", "i8x16", "i16x8", "i32x4", "i64x2", "f32x4", "f64x2",
.Cases({"v128", "i8x16", "i16x8", "i32x4", "i64x2", "f32x4", "f64x2"},
wasm::ValType::V128)
.Case("funcref", wasm::ValType::FUNCREF)
.Case("externref", wasm::ValType::EXTERNREF)

View File

@ -3514,15 +3514,16 @@ bool X86AsmParser::parseInstruction(ParseInstructionInfo &Info, StringRef Name,
// xacquire <insn> ; xacquire must be accompanied by 'lock'
bool IsPrefix =
StringSwitch<bool>(Name)
.Cases("cs", "ds", "es", "fs", "gs", "ss", true)
.Cases("rex64", "data32", "data16", "addr32", "addr16", true)
.Cases("xacquire", "xrelease", true)
.Cases("acquire", "release", isParsingIntelSyntax())
.Cases({"cs", "ds", "es", "fs", "gs", "ss"}, true)
.Cases({"rex64", "data32", "data16", "addr32", "addr16"}, true)
.Cases({"xacquire", "xrelease"}, true)
.Cases({"acquire", "release"}, isParsingIntelSyntax())
.Default(false);
auto isLockRepeatNtPrefix = [](StringRef N) {
return StringSwitch<bool>(N)
.Cases("lock", "rep", "repe", "repz", "repne", "repnz", "notrack", true)
.Cases({"lock", "rep", "repe", "repz", "repne", "repnz", "notrack"},
true)
.Default(false);
};

View File

@ -22,13 +22,13 @@ StringRef ARM::getArchSynonym(StringRef Arch) {
.Case("v5e", "v5te")
.Case("v6j", "v6")
.Case("v6hl", "v6k")
.Cases("v6m", "v6sm", "v6s-m", "v6-m")
.Cases("v6z", "v6zk", "v6kz")
.Cases("v7", "v7a", "v7hl", "v7l", "v7-a")
.Cases({"v6m", "v6sm", "v6s-m"}, "v6-m")
.Cases({"v6z", "v6zk"}, "v6kz")
.Cases({"v7", "v7a", "v7hl", "v7l"}, "v7-a")
.Case("v7r", "v7-r")
.Case("v7m", "v7-m")
.Case("v7em", "v7e-m")
.Cases("v8", "v8a", "v8l", "aarch64", "arm64", "v8-a")
.Cases({"v8", "v8a", "v8l", "aarch64", "arm64"}, "v8-a")
.Case("v8.1a", "v8.1-a")
.Case("v8.2a", "v8.2-a")
.Case("v8.3a", "v8.3-a")
@ -39,7 +39,7 @@ StringRef ARM::getArchSynonym(StringRef Arch) {
.Case("v8.8a", "v8.8-a")
.Case("v8.9a", "v8.9-a")
.Case("v8r", "v8-r")
.Cases("v9", "v9a", "v9-a")
.Cases({"v9", "v9a"}, "v9-a")
.Case("v9.1a", "v9.1-a")
.Case("v9.2a", "v9.2-a")
.Case("v9.3a", "v9.3-a")

View File

@ -579,87 +579,89 @@ static Triple::ArchType parseARMArch(StringRef ArchName) {
}
static Triple::ArchType parseArch(StringRef ArchName) {
auto AT = StringSwitch<Triple::ArchType>(ArchName)
.Cases("i386", "i486", "i586", "i686", Triple::x86)
// FIXME: Do we need to support these?
.Cases("i786", "i886", "i986", Triple::x86)
.Cases("amd64", "x86_64", "x86_64h", Triple::x86_64)
.Cases("powerpc", "powerpcspe", "ppc", "ppc32", Triple::ppc)
.Cases("powerpcle", "ppcle", "ppc32le", Triple::ppcle)
.Cases("powerpc64", "ppu", "ppc64", Triple::ppc64)
.Cases("powerpc64le", "ppc64le", Triple::ppc64le)
.Case("xscale", Triple::arm)
.Case("xscaleeb", Triple::armeb)
.Case("aarch64", Triple::aarch64)
.Case("aarch64_be", Triple::aarch64_be)
.Case("aarch64_32", Triple::aarch64_32)
.Case("arc", Triple::arc)
.Case("arm64", Triple::aarch64)
.Case("arm64_32", Triple::aarch64_32)
.Case("arm64e", Triple::aarch64)
.Case("arm64ec", Triple::aarch64)
.Case("arm", Triple::arm)
.Case("armeb", Triple::armeb)
.Case("thumb", Triple::thumb)
.Case("thumbeb", Triple::thumbeb)
.Case("avr", Triple::avr)
.Case("m68k", Triple::m68k)
.Case("msp430", Triple::msp430)
.Cases("mips", "mipseb", "mipsallegrex", "mipsisa32r6",
"mipsr6", Triple::mips)
.Cases("mipsel", "mipsallegrexel", "mipsisa32r6el", "mipsr6el",
Triple::mipsel)
.Cases("mips64", "mips64eb", "mipsn32", "mipsisa64r6",
"mips64r6", "mipsn32r6", Triple::mips64)
.Cases("mips64el", "mipsn32el", "mipsisa64r6el", "mips64r6el",
"mipsn32r6el", Triple::mips64el)
.Case("r600", Triple::r600)
.Case("amdgcn", Triple::amdgcn)
.Case("riscv32", Triple::riscv32)
.Case("riscv64", Triple::riscv64)
.Case("riscv32be", Triple::riscv32be)
.Case("riscv64be", Triple::riscv64be)
.Case("hexagon", Triple::hexagon)
.Cases("s390x", "systemz", Triple::systemz)
.Case("sparc", Triple::sparc)
.Case("sparcel", Triple::sparcel)
.Cases("sparcv9", "sparc64", Triple::sparcv9)
.Case("tce", Triple::tce)
.Case("tcele", Triple::tcele)
.Case("xcore", Triple::xcore)
.Case("nvptx", Triple::nvptx)
.Case("nvptx64", Triple::nvptx64)
.Case("amdil", Triple::amdil)
.Case("amdil64", Triple::amdil64)
.Case("hsail", Triple::hsail)
.Case("hsail64", Triple::hsail64)
.Case("spir", Triple::spir)
.Case("spir64", Triple::spir64)
.Cases("spirv", "spirv1.5", "spirv1.6", Triple::spirv)
.Cases("spirv32", "spirv32v1.0", "spirv32v1.1", "spirv32v1.2",
"spirv32v1.3", "spirv32v1.4", "spirv32v1.5",
"spirv32v1.6", Triple::spirv32)
.Cases("spirv64", "spirv64v1.0", "spirv64v1.1", "spirv64v1.2",
"spirv64v1.3", "spirv64v1.4", "spirv64v1.5",
"spirv64v1.6", Triple::spirv64)
.StartsWith("kalimba", Triple::kalimba)
.Case("lanai", Triple::lanai)
.Case("renderscript32", Triple::renderscript32)
.Case("renderscript64", Triple::renderscript64)
.Case("shave", Triple::shave)
.Case("ve", Triple::ve)
.Case("wasm32", Triple::wasm32)
.Case("wasm64", Triple::wasm64)
.Case("csky", Triple::csky)
.Case("loongarch32", Triple::loongarch32)
.Case("loongarch64", Triple::loongarch64)
.Cases("dxil", "dxilv1.0", "dxilv1.1", "dxilv1.2", "dxilv1.3",
"dxilv1.4", "dxilv1.5", "dxilv1.6", "dxilv1.7",
"dxilv1.8", Triple::dxil)
// Note: Cases has max limit of 10.
.Case("dxilv1.9", Triple::dxil)
.Case("xtensa", Triple::xtensa)
.Default(Triple::UnknownArch);
auto AT =
StringSwitch<Triple::ArchType>(ArchName)
.Cases({"i386", "i486", "i586", "i686"}, Triple::x86)
// FIXME: Do we need to support these?
.Cases({"i786", "i886", "i986"}, Triple::x86)
.Cases({"amd64", "x86_64", "x86_64h"}, Triple::x86_64)
.Cases({"powerpc", "powerpcspe", "ppc", "ppc32"}, Triple::ppc)
.Cases({"powerpcle", "ppcle", "ppc32le"}, Triple::ppcle)
.Cases({"powerpc64", "ppu", "ppc64"}, Triple::ppc64)
.Cases({"powerpc64le", "ppc64le"}, Triple::ppc64le)
.Case("xscale", Triple::arm)
.Case("xscaleeb", Triple::armeb)
.Case("aarch64", Triple::aarch64)
.Case("aarch64_be", Triple::aarch64_be)
.Case("aarch64_32", Triple::aarch64_32)
.Case("arc", Triple::arc)
.Case("arm64", Triple::aarch64)
.Case("arm64_32", Triple::aarch64_32)
.Case("arm64e", Triple::aarch64)
.Case("arm64ec", Triple::aarch64)
.Case("arm", Triple::arm)
.Case("armeb", Triple::armeb)
.Case("thumb", Triple::thumb)
.Case("thumbeb", Triple::thumbeb)
.Case("avr", Triple::avr)
.Case("m68k", Triple::m68k)
.Case("msp430", Triple::msp430)
.Cases({"mips", "mipseb", "mipsallegrex", "mipsisa32r6", "mipsr6"},
Triple::mips)
.Cases({"mipsel", "mipsallegrexel", "mipsisa32r6el", "mipsr6el"},
Triple::mipsel)
.Cases({"mips64", "mips64eb", "mipsn32", "mipsisa64r6", "mips64r6",
"mipsn32r6"},
Triple::mips64)
.Cases({"mips64el", "mipsn32el", "mipsisa64r6el", "mips64r6el",
"mipsn32r6el"},
Triple::mips64el)
.Case("r600", Triple::r600)
.Case("amdgcn", Triple::amdgcn)
.Case("riscv32", Triple::riscv32)
.Case("riscv64", Triple::riscv64)
.Case("riscv32be", Triple::riscv32be)
.Case("riscv64be", Triple::riscv64be)
.Case("hexagon", Triple::hexagon)
.Cases({"s390x", "systemz"}, Triple::systemz)
.Case("sparc", Triple::sparc)
.Case("sparcel", Triple::sparcel)
.Cases({"sparcv9", "sparc64"}, Triple::sparcv9)
.Case("tce", Triple::tce)
.Case("tcele", Triple::tcele)
.Case("xcore", Triple::xcore)
.Case("nvptx", Triple::nvptx)
.Case("nvptx64", Triple::nvptx64)
.Case("amdil", Triple::amdil)
.Case("amdil64", Triple::amdil64)
.Case("hsail", Triple::hsail)
.Case("hsail64", Triple::hsail64)
.Case("spir", Triple::spir)
.Case("spir64", Triple::spir64)
.Cases({"spirv", "spirv1.5", "spirv1.6"}, Triple::spirv)
.Cases({"spirv32", "spirv32v1.0", "spirv32v1.1", "spirv32v1.2",
"spirv32v1.3", "spirv32v1.4", "spirv32v1.5", "spirv32v1.6"},
Triple::spirv32)
.Cases({"spirv64", "spirv64v1.0", "spirv64v1.1", "spirv64v1.2",
"spirv64v1.3", "spirv64v1.4", "spirv64v1.5", "spirv64v1.6"},
Triple::spirv64)
.StartsWith("kalimba", Triple::kalimba)
.Case("lanai", Triple::lanai)
.Case("renderscript32", Triple::renderscript32)
.Case("renderscript64", Triple::renderscript64)
.Case("shave", Triple::shave)
.Case("ve", Triple::ve)
.Case("wasm32", Triple::wasm32)
.Case("wasm64", Triple::wasm64)
.Case("csky", Triple::csky)
.Case("loongarch32", Triple::loongarch32)
.Case("loongarch64", Triple::loongarch64)
.Cases({"dxil", "dxilv1.0", "dxilv1.1", "dxilv1.2", "dxilv1.3",
"dxilv1.4", "dxilv1.5", "dxilv1.6", "dxilv1.7", "dxilv1.8",
"dxilv1.9"},
Triple::dxil)
.Case("xtensa", Triple::xtensa)
.Default(Triple::UnknownArch);
// Some architectures require special parsing logic just to compute the
// ArchType result.
@ -1071,7 +1073,7 @@ Triple::Triple(std::string &&Str) : Data(std::move(Str)) {
.StartsWith("mips64", Triple::GNUABI64)
.StartsWith("mipsisa64", Triple::GNUABI64)
.StartsWith("mipsisa32", Triple::GNU)
.Cases("mips", "mipsel", "mipsr6", "mipsr6el", Triple::GNU)
.Cases({"mips", "mipsel", "mipsr6", "mipsr6el"}, Triple::GNU)
.Default(UnknownEnvironment);
}
}

View File

@ -555,7 +555,7 @@ void FastISelMap::collectPatterns(const CodeGenDAGPatterns &CGP) {
raw_string_ostream SuffixOS(ManglingSuffix);
Operands.PrintManglingSuffix(SuffixOS, ImmediatePredicates, true);
if (!StringSwitch<bool>(ManglingSuffix)
.Cases("", "r", "rr", "ri", "i", "f", true)
.Cases({"", "r", "rr", "ri", "i", "f"}, true)
.Default(false))
continue;