Skip to content

Commit 37ac6af

Browse files
committed
[NFC][HLSL] Replace uses of getResourceName/printEnum
Introduce the `enumToStringRef` enum into `ScopedPrinter.h` that replicates `enumToString` behaviour, expect that instead of returning a hex value string, it just returns an empty string. This allows us to return a StringRef and easily check if an invalid enum was provided based on the StringRef size This then uses `enumToStringRef` to remove the redundant `getResourceName` and `printEnum` functions. Resolves:
1 parent dbaa82b commit 37ac6af

File tree

3 files changed

+29
-45
lines changed

3 files changed

+29
-45
lines changed

llvm/include/llvm/Support/ScopedPrinter.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,14 @@ std::string enumToString(T Value, ArrayRef<EnumEntry<TEnum>> EnumValues) {
107107
return utohexstr(Value, true);
108108
}
109109

110+
template <typename T, typename TEnum>
111+
StringRef enumToStringRef(T Value, ArrayRef<EnumEntry<TEnum>> EnumValues) {
112+
for (const EnumEntry<TEnum> &EnumItem : EnumValues)
113+
if (EnumItem.Value == Value)
114+
return EnumItem.AltName;
115+
return "";
116+
}
117+
110118
class LLVM_ABI ScopedPrinter {
111119
public:
112120
enum class ScopedPrinterKind {

llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,6 @@ namespace llvm {
1717
namespace hlsl {
1818
namespace rootsig {
1919

20-
template <typename T>
21-
static std::optional<StringRef> getEnumName(const T Value,
22-
ArrayRef<EnumEntry<T>> Enums) {
23-
for (const auto &EnumItem : Enums)
24-
if (EnumItem.Value == Value)
25-
return EnumItem.Name;
26-
return std::nullopt;
27-
}
28-
29-
template <typename T>
30-
static raw_ostream &printEnum(raw_ostream &OS, const T Value,
31-
ArrayRef<EnumEntry<T>> Enums) {
32-
auto MaybeName = getEnumName(Value, Enums);
33-
if (MaybeName)
34-
OS << *MaybeName;
35-
return OS;
36-
}
37-
3820
template <typename T>
3921
static raw_ostream &printFlags(raw_ostream &OS, const T Value,
4022
ArrayRef<EnumEntry<T>> Flags) {
@@ -46,9 +28,9 @@ static raw_ostream &printFlags(raw_ostream &OS, const T Value,
4628
if (FlagSet)
4729
OS << " | ";
4830

49-
auto MaybeFlag = getEnumName(T(Bit), Flags);
50-
if (MaybeFlag)
51-
OS << *MaybeFlag;
31+
StringRef MaybeFlag = enumToStringRef(T(Bit), Flags);
32+
if (0 < MaybeFlag.size())
33+
OS << MaybeFlag;
5234
else
5335
OS << "invalid: " << Bit;
5436

@@ -70,43 +52,42 @@ static const EnumEntry<RegisterType> RegisterNames[] = {
7052
};
7153

7254
static raw_ostream &operator<<(raw_ostream &OS, const Register &Reg) {
73-
printEnum(OS, Reg.ViewType, ArrayRef(RegisterNames));
74-
OS << Reg.Number;
55+
OS << enumToStringRef(Reg.ViewType, ArrayRef(RegisterNames)) << Reg.Number;
7556

7657
return OS;
7758
}
7859

7960
static raw_ostream &operator<<(raw_ostream &OS,
8061
const llvm::dxbc::ShaderVisibility &Visibility) {
81-
printEnum(OS, Visibility, dxbc::getShaderVisibility());
62+
OS << enumToStringRef(Visibility, dxbc::getShaderVisibility());
8263

8364
return OS;
8465
}
8566

8667
static raw_ostream &operator<<(raw_ostream &OS,
8768
const llvm::dxbc::SamplerFilter &Filter) {
88-
printEnum(OS, Filter, dxbc::getSamplerFilters());
69+
OS << enumToStringRef(Filter, dxbc::getSamplerFilters());
8970

9071
return OS;
9172
}
9273

9374
static raw_ostream &operator<<(raw_ostream &OS,
9475
const dxbc::TextureAddressMode &Address) {
95-
printEnum(OS, Address, dxbc::getTextureAddressModes());
76+
OS << enumToStringRef(Address, dxbc::getTextureAddressModes());
9677

9778
return OS;
9879
}
9980

10081
static raw_ostream &operator<<(raw_ostream &OS,
10182
const dxbc::ComparisonFunc &CompFunc) {
102-
printEnum(OS, CompFunc, dxbc::getComparisonFuncs());
83+
OS << enumToStringRef(CompFunc, dxbc::getComparisonFuncs());
10384

10485
return OS;
10586
}
10687

10788
static raw_ostream &operator<<(raw_ostream &OS,
10889
const dxbc::StaticBorderColor &BorderColor) {
109-
printEnum(OS, BorderColor, dxbc::getStaticBorderColors());
90+
OS << enumToStringRef(BorderColor, dxbc::getStaticBorderColors());
11091

11192
return OS;
11293
}
@@ -119,8 +100,8 @@ static const EnumEntry<dxil::ResourceClass> ResourceClassNames[] = {
119100
};
120101

121102
static raw_ostream &operator<<(raw_ostream &OS, const ClauseType &Type) {
122-
printEnum(OS, dxil::ResourceClass(llvm::to_underlying(Type)),
123-
ArrayRef(ResourceClassNames));
103+
OS << enumToStringRef(dxil::ResourceClass(llvm::to_underlying(Type)),
104+
ArrayRef(ResourceClassNames));
124105

125106
return OS;
126107
}

llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,6 @@ static const EnumEntry<dxil::ResourceClass> ResourceClassNames[] = {
5858
{"Sampler", dxil::ResourceClass::Sampler},
5959
};
6060

61-
static std::optional<StringRef> getResourceName(dxil::ResourceClass Class) {
62-
for (const auto &ClassEnum : ResourceClassNames)
63-
if (ClassEnum.Value == Class)
64-
return ClassEnum.Name;
65-
return std::nullopt;
66-
}
67-
6861
namespace {
6962

7063
// We use the OverloadVisit with std::visit to ensure the compiler catches if a
@@ -133,10 +126,11 @@ MDNode *MetadataBuilder::BuildRootConstants(const RootConstants &Constants) {
133126

134127
MDNode *MetadataBuilder::BuildRootDescriptor(const RootDescriptor &Descriptor) {
135128
IRBuilder<> Builder(Ctx);
136-
std::optional<StringRef> ResName =
137-
getResourceName(dxil::ResourceClass(to_underlying(Descriptor.Type)));
138-
assert(ResName && "Provided an invalid Resource Class");
139-
SmallString<7> Name({"Root", *ResName});
129+
StringRef ResName =
130+
enumToStringRef(dxil::ResourceClass(to_underlying(Descriptor.Type)),
131+
ArrayRef(ResourceClassNames));
132+
assert(0 < ResName.size() && "Provided an invalid Resource Class");
133+
SmallString<7> Name({"Root", ResName});
140134
Metadata *Operands[] = {
141135
MDString::get(Ctx, Name),
142136
ConstantAsMetadata::get(
@@ -174,11 +168,12 @@ MDNode *MetadataBuilder::BuildDescriptorTable(const DescriptorTable &Table) {
174168
MDNode *MetadataBuilder::BuildDescriptorTableClause(
175169
const DescriptorTableClause &Clause) {
176170
IRBuilder<> Builder(Ctx);
177-
std::optional<StringRef> ResName =
178-
getResourceName(dxil::ResourceClass(to_underlying(Clause.Type)));
179-
assert(ResName && "Provided an invalid Resource Class");
171+
StringRef ResName =
172+
enumToStringRef(dxil::ResourceClass(to_underlying(Clause.Type)),
173+
ArrayRef(ResourceClassNames));
174+
assert(0 < ResName.size() && "Provided an invalid Resource Class");
180175
Metadata *Operands[] = {
181-
MDString::get(Ctx, *ResName),
176+
MDString::get(Ctx, ResName),
182177
ConstantAsMetadata::get(Builder.getInt32(Clause.NumDescriptors)),
183178
ConstantAsMetadata::get(Builder.getInt32(Clause.Reg.Number)),
184179
ConstantAsMetadata::get(Builder.getInt32(Clause.Space)),

0 commit comments

Comments
 (0)