1919#include " llvm/Support/Endian.h"
2020#include " llvm/Support/JSON.h"
2121#include " llvm/Support/raw_ostream.h"
22+ #include < type_traits>
2223
2324namespace llvm {
2425
@@ -41,8 +42,8 @@ template <typename T> struct EnumEntry {
4142struct HexNumber {
4243 // To avoid sign-extension we have to explicitly cast to the appropriate
4344 // unsigned type. The overloads are here so that every type that is implicitly
44- // convertible to an integer (including enums and endian helpers) can be used
45- // without requiring type traits or call-site changes.
45+ // convertible to an integer (including endian helpers) can be used without
46+ // requiring type traits or call-site changes.
4647 HexNumber (char Value) : Value(static_cast <unsigned char >(Value)) {}
4748 HexNumber (signed char Value) : Value(static_cast <unsigned char >(Value)) {}
4849 HexNumber (signed short Value) : Value(static_cast <unsigned short >(Value)) {}
@@ -55,6 +56,10 @@ struct HexNumber {
5556 HexNumber (unsigned int Value) : Value(Value) {}
5657 HexNumber (unsigned long Value) : Value(Value) {}
5758 HexNumber (unsigned long long Value) : Value(Value) {}
59+ template <typename EnumT, typename = std::enable_if_t <std::is_enum_v<EnumT>>>
60+ HexNumber (EnumT Value)
61+ : HexNumber(static_cast <std::underlying_type_t <EnumT>>(Value)) {}
62+
5863 uint64_t Value;
5964};
6065
@@ -77,6 +82,10 @@ struct FlagEntry {
7782 FlagEntry (StringRef Name, unsigned long Value) : Name(Name), Value(Value) {}
7883 FlagEntry (StringRef Name, unsigned long long Value)
7984 : Name(Name), Value(Value) {}
85+ template <typename EnumT, typename = std::enable_if_t <std::is_enum_v<EnumT>>>
86+ FlagEntry (StringRef Name, EnumT Value)
87+ : FlagEntry(Name, static_cast <std::underlying_type_t <EnumT>>(Value)) {}
88+
8089 StringRef Name;
8190 uint64_t Value;
8291};
@@ -165,17 +174,17 @@ class LLVM_ABI ScopedPrinter {
165174 SmallVector<FlagEntry, 10 > SetFlags (ExtraFlags);
166175
167176 for (const auto &Flag : Flags) {
168- if (Flag.Value == 0 )
177+ if (Flag.Value == TFlag{} )
169178 continue ;
170179
171180 TFlag EnumMask{};
172- if (Flag.Value & EnumMask1)
181+ if (( Flag.Value & EnumMask1) != TFlag{} )
173182 EnumMask = EnumMask1;
174- else if (Flag.Value & EnumMask2)
183+ else if (( Flag.Value & EnumMask2) != TFlag{} )
175184 EnumMask = EnumMask2;
176- else if (Flag.Value & EnumMask3)
185+ else if (( Flag.Value & EnumMask3) != TFlag{} )
177186 EnumMask = EnumMask3;
178- bool IsEnum = (Flag.Value & EnumMask) != 0 ;
187+ bool IsEnum = (Flag.Value & EnumMask) != TFlag{} ;
179188 if ((!IsEnum && (Value & Flag.Value ) == Flag.Value ) ||
180189 (IsEnum && (Value & EnumMask) == Flag.Value )) {
181190 SetFlags.emplace_back (Flag.Name , Flag.Value );
0 commit comments