================
@@ -18,38 +18,39 @@
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include <optional>
+#include <sstream>
 #include <string>
 
 using namespace llvm;
 
 namespace {
 const char *ARMArch[] = {
-    "armv4",        "armv4t",      "armv5",          "armv5t",      "armv5e",
-    "armv5te",      "armv5tej",    "armv6",          "armv6j",      "armv6k",
-    "armv6hl",      "armv6t2",     "armv6kz",        "armv6z",      "armv6zk",
-    "armv6-m",      "armv6m",      "armv6sm",        "armv6s-m",    "armv7-a",
-    "armv7",        "armv7a",      "armv7ve",        "armv7hl",     "armv7l",
-    "armv7-r",      "armv7r",      "armv7-m",        "armv7m",      "armv7k",
-    "armv7s",       "armv7e-m",    "armv7em",        "armv8-a",     "armv8",
-    "armv8a",       "armv8l",      "armv8.1-a",      "armv8.1a",    
"armv8.2-a",
-    "armv8.2a",     "armv8.3-a",   "armv8.3a",       "armv8.4-a",   "armv8.4a",
-    "armv8.5-a",    "armv8.5a",    "armv8.6-a",      "armv8.6a",    
"armv8.7-a",
-    "armv8.7a",     "armv8.8-a",   "armv8.8a",       "armv8.9-a",   "armv8.9a",
-    "armv8-r",      "armv8r",      "armv8-m.base",   "armv8m.base", 
"armv8-m.main",
-    "armv8m.main",  "iwmmxt",      "iwmmxt2",        "xscale",      
"armv8.1-m.main",
-    "armv9-a",      "armv9",       "armv9a",         "armv9.1-a",   "armv9.1a",
-    "armv9.2-a",    "armv9.2a",    "armv9.3-a",      "armv9.3a",    
"armv9.4-a",
+    "armv4",       "armv4t",    "armv5",        "armv5t",      "armv5e",
+    "armv5te",     "armv5tej",  "armv6",        "armv6j",      "armv6k",
+    "armv6hl",     "armv6t2",   "armv6kz",      "armv6z",      "armv6zk",
+    "armv6-m",     "armv6m",    "armv6sm",      "armv6s-m",    "armv7-a",
+    "armv7",       "armv7a",    "armv7ve",      "armv7hl",     "armv7l",
+    "armv7-r",     "armv7r",    "armv7-m",      "armv7m",      "armv7k",
+    "armv7s",      "armv7e-m",  "armv7em",      "armv8-a",     "armv8",
+    "armv8a",      "armv8l",    "armv8.1-a",    "armv8.1a",    "armv8.2-a",
+    "armv8.2a",    "armv8.3-a", "armv8.3a",     "armv8.4-a",   "armv8.4a",
+    "armv8.5-a",   "armv8.5a",  "armv8.6-a",    "armv8.6a",    "armv8.7-a",
+    "armv8.7a",    "armv8.8-a", "armv8.8a",     "armv8.9-a",   "armv8.9a",
+    "armv8-r",     "armv8r",    "armv8-m.base", "armv8m.base", "armv8-m.main",
+    "armv8m.main", "iwmmxt",    "iwmmxt2",      "xscale",      
"armv8.1-m.main",
+    "armv9-a",     "armv9",     "armv9a",       "armv9.1-a",   "armv9.1a",
+    "armv9.2-a",   "armv9.2a",  "armv9.3-a",    "armv9.3a",    "armv9.4-a",
     "armv9.4a",
 };
 
-template <ARM::ISAKind ISAKind>
-std::string FormatExtensionFlags(uint64_t Flags) {
+template <ARM::ISAKind ISAKind, typename T>
+std::string FormatExtensionFlags(T Flags) {
   std::vector<StringRef> Features;
 
-  if (ISAKind == ARM::ISAKind::AARCH64) {
+  if constexpr (ISAKind == ARM::ISAKind::AARCH64) {
     // AEK_NONE is not meant to be shown to the user so the target parser
     // does not recognise it. It is relevant here though.
-    if (Flags & AArch64::AEK_NONE)
+    if (Flags.test(AArch64::AEK_NONE))
----------------
sdesmalen-arm wrote:

> why is the suggested solution better ?

You're relying on the compiler folding away a branch based on a `constexpr`, as 
otherwise that folded branch will lead to Clang giving a compilation error. It 
seems more natural and easier to maintain to just have overloaded functions for 
that so that the compiler can select the function which matches the types it's 
given, without having to worry about the interaction with the other template 
parameter. See an example here: https://godbolt.org/z/c6cTvzPre

https://github.com/llvm/llvm-project/pull/65423
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to