================ @@ -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