Skip to content

Commit 5f20b41

Browse files
committed
nfc: use llvm::EnumEntry to convert Enum to Strings
1 parent b88e8cc commit 5f20b41

File tree

1 file changed

+85
-87
lines changed

1 file changed

+85
-87
lines changed

llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp

Lines changed: 85 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -15,119 +15,117 @@
1515
#include "llvm/ADT/bit.h"
1616
#include "llvm/IR/IRBuilder.h"
1717
#include "llvm/IR/Metadata.h"
18+
#include "llvm/Support/ScopedPrinter.h"
1819

1920
namespace llvm {
2021
namespace hlsl {
2122
namespace rootsig {
2223

23-
static raw_ostream &operator<<(raw_ostream &OS, const Register &Reg) {
24-
switch (Reg.ViewType) {
25-
case RegisterType::BReg:
26-
OS << "b";
27-
break;
28-
case RegisterType::TReg:
29-
OS << "t";
30-
break;
31-
case RegisterType::UReg:
32-
OS << "u";
33-
break;
34-
case RegisterType::SReg:
35-
OS << "s";
36-
break;
37-
}
38-
OS << Reg.Number;
39-
return OS;
24+
template <typename T>
25+
static StringRef getEnumName(const T Value, ArrayRef<EnumEntry<T>> Enums) {
26+
for (const auto &EnumItem : Enums)
27+
if (EnumItem.Value == Value)
28+
return EnumItem.Name;
29+
return "";
4030
}
4131

42-
static raw_ostream &operator<<(raw_ostream &OS,
43-
const ShaderVisibility &Visibility) {
44-
switch (Visibility) {
45-
case ShaderVisibility::All:
46-
OS << "All";
47-
break;
48-
case ShaderVisibility::Vertex:
49-
OS << "Vertex";
50-
break;
51-
case ShaderVisibility::Hull:
52-
OS << "Hull";
53-
break;
54-
case ShaderVisibility::Domain:
55-
OS << "Domain";
56-
break;
57-
case ShaderVisibility::Geometry:
58-
OS << "Geometry";
59-
break;
60-
case ShaderVisibility::Pixel:
61-
OS << "Pixel";
62-
break;
63-
case ShaderVisibility::Amplification:
64-
OS << "Amplification";
65-
break;
66-
case ShaderVisibility::Mesh:
67-
OS << "Mesh";
68-
break;
69-
}
32+
template <typename T>
33+
static raw_ostream &printEnum(raw_ostream &OS, const T Value,
34+
ArrayRef<EnumEntry<T>> Enums) {
35+
OS << getEnumName(Value, Enums);
7036

7137
return OS;
7238
}
7339

74-
static raw_ostream &operator<<(raw_ostream &OS, const ClauseType &Type) {
75-
switch (Type) {
76-
case ClauseType::CBuffer:
77-
OS << "CBV";
78-
break;
79-
case ClauseType::SRV:
80-
OS << "SRV";
81-
break;
82-
case ClauseType::UAV:
83-
OS << "UAV";
84-
break;
85-
case ClauseType::Sampler:
86-
OS << "Sampler";
87-
break;
88-
}
89-
90-
return OS;
91-
}
92-
93-
static raw_ostream &operator<<(raw_ostream &OS,
94-
const DescriptorRangeFlags &Flags) {
40+
template <typename T>
41+
static raw_ostream &printFlags(raw_ostream &OS, const T Value,
42+
ArrayRef<EnumEntry<T>> Flags) {
9543
bool FlagSet = false;
96-
unsigned Remaining = llvm::to_underlying(Flags);
44+
unsigned Remaining = llvm::to_underlying(Value);
9745
while (Remaining) {
9846
unsigned Bit = 1u << llvm::countr_zero(Remaining);
9947
if (Remaining & Bit) {
10048
if (FlagSet)
10149
OS << " | ";
10250

103-
switch (static_cast<DescriptorRangeFlags>(Bit)) {
104-
case DescriptorRangeFlags::DescriptorsVolatile:
105-
OS << "DescriptorsVolatile";
106-
break;
107-
case DescriptorRangeFlags::DataVolatile:
108-
OS << "DataVolatile";
109-
break;
110-
case DescriptorRangeFlags::DataStaticWhileSetAtExecute:
111-
OS << "DataStaticWhileSetAtExecute";
112-
break;
113-
case DescriptorRangeFlags::DataStatic:
114-
OS << "DataStatic";
115-
break;
116-
case DescriptorRangeFlags::DescriptorsStaticKeepingBufferBoundsChecks:
117-
OS << "DescriptorsStaticKeepingBufferBoundsChecks";
118-
break;
119-
default:
51+
bool Found = false;
52+
for (const auto &FlagItem : Flags)
53+
if (FlagItem.Value == T(Bit)) {
54+
OS << FlagItem.Name;
55+
Found = true;
56+
break;
57+
}
58+
if (!Found)
12059
OS << "invalid: " << Bit;
121-
break;
122-
}
123-
12460
FlagSet = true;
12561
}
12662
Remaining &= ~Bit;
12763
}
12864

12965
if (!FlagSet)
13066
OS << "None";
67+
return OS;
68+
}
69+
70+
static const EnumEntry<RegisterType> RegisterNames[] = {
71+
{"b", RegisterType::BReg},
72+
{"t", RegisterType::TReg},
73+
{"u", RegisterType::UReg},
74+
{"s", RegisterType::SReg},
75+
};
76+
77+
static raw_ostream &operator<<(raw_ostream &OS, const Register &Reg) {
78+
printEnum(OS, Reg.ViewType, ArrayRef(RegisterNames));
79+
OS << Reg.Number;
80+
81+
return OS;
82+
}
83+
84+
static const EnumEntry<ShaderVisibility> VisibilityNames[] = {
85+
{"All", ShaderVisibility::All},
86+
{"Vertex", ShaderVisibility::Vertex},
87+
{"Hull", ShaderVisibility::Hull},
88+
{"Domain", ShaderVisibility::Domain},
89+
{"Geometry", ShaderVisibility::Geometry},
90+
{"Pixel", ShaderVisibility::Pixel},
91+
{"Amplification", ShaderVisibility::Amplification},
92+
{"Mesh", ShaderVisibility::Mesh},
93+
};
94+
95+
static raw_ostream &operator<<(raw_ostream &OS,
96+
const ShaderVisibility &Visibility) {
97+
printEnum(OS, Visibility, ArrayRef(VisibilityNames));
98+
99+
return OS;
100+
}
101+
102+
static const EnumEntry<dxil::ResourceClass> ResourceClassNames[] = {
103+
{"CBV", dxil::ResourceClass::CBuffer},
104+
{"SRV", dxil::ResourceClass::SRV},
105+
{"UAV", dxil::ResourceClass::UAV},
106+
{"Sampler", dxil::ResourceClass::Sampler},
107+
};
108+
109+
static raw_ostream &operator<<(raw_ostream &OS, const ClauseType &Type) {
110+
printEnum(OS, dxil::ResourceClass(llvm::to_underlying(Type)),
111+
ArrayRef(ResourceClassNames));
112+
113+
return OS;
114+
}
115+
116+
static const EnumEntry<DescriptorRangeFlags> DescriptorRangeFlagNames[] = {
117+
{"DescriptorsVolatile", DescriptorRangeFlags::DescriptorsVolatile},
118+
{"DataVolatile", DescriptorRangeFlags::DataVolatile},
119+
{"DataStaticWhileSetAtExecute",
120+
DescriptorRangeFlags::DataStaticWhileSetAtExecute},
121+
{"DataStatic", DescriptorRangeFlags::DataStatic},
122+
{"DescriptorsStaticKeepingBufferBoundsChecks",
123+
DescriptorRangeFlags::DescriptorsStaticKeepingBufferBoundsChecks},
124+
};
125+
126+
static raw_ostream &operator<<(raw_ostream &OS,
127+
const DescriptorRangeFlags &Flags) {
128+
printFlags(OS, Flags, ArrayRef(DescriptorRangeFlagNames));
131129

132130
return OS;
133131
}

0 commit comments

Comments
 (0)