Skip to content

Commit b2e5303

Browse files
joaosaffranjoaosaffranJoao Saffran
authored
[DirectX] Error handling improve in root signature metadata Parser (#149232)
This PR addresses #144465 (comment). Using `joinErrors` and `llvm:Error` instead of boolean values. --------- Co-authored-by: joaosaffran <[email protected]> Co-authored-by: Joao Saffran <{ID}+{username}@users.noreply.github.com>
1 parent b5cd8c3 commit b2e5303

9 files changed

+375
-242
lines changed

llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h

Lines changed: 94 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#ifndef LLVM_FRONTEND_HLSL_ROOTSIGNATUREMETADATA_H
1515
#define LLVM_FRONTEND_HLSL_ROOTSIGNATUREMETADATA_H
1616

17+
#include "llvm/ADT/StringRef.h"
1718
#include "llvm/Frontend/HLSL/HLSLRootSignature.h"
1819
#include "llvm/IR/Constants.h"
1920
#include "llvm/MC/DXContainerRootSignature.h"
@@ -26,6 +27,80 @@ class Metadata;
2627
namespace hlsl {
2728
namespace rootsig {
2829

30+
template <typename T>
31+
class RootSignatureValidationError
32+
: public ErrorInfo<RootSignatureValidationError<T>> {
33+
public:
34+
static char ID;
35+
StringRef ParamName;
36+
T Value;
37+
38+
RootSignatureValidationError(StringRef ParamName, T Value)
39+
: ParamName(ParamName), Value(Value) {}
40+
41+
void log(raw_ostream &OS) const override {
42+
OS << "Invalid value for " << ParamName << ": " << Value;
43+
}
44+
45+
std::error_code convertToErrorCode() const override {
46+
return llvm::inconvertibleErrorCode();
47+
}
48+
};
49+
50+
class GenericRSMetadataError : public ErrorInfo<GenericRSMetadataError> {
51+
public:
52+
static char ID;
53+
StringRef Message;
54+
MDNode *MD;
55+
56+
GenericRSMetadataError(StringRef Message, MDNode *MD)
57+
: Message(Message), MD(MD) {}
58+
59+
void log(raw_ostream &OS) const override {
60+
OS << Message;
61+
if (MD) {
62+
OS << "\n";
63+
MD->printTree(OS);
64+
}
65+
}
66+
67+
std::error_code convertToErrorCode() const override {
68+
return llvm::inconvertibleErrorCode();
69+
}
70+
};
71+
72+
class InvalidRSMetadataFormat : public ErrorInfo<InvalidRSMetadataFormat> {
73+
public:
74+
static char ID;
75+
StringRef ElementName;
76+
77+
InvalidRSMetadataFormat(StringRef ElementName) : ElementName(ElementName) {}
78+
79+
void log(raw_ostream &OS) const override {
80+
OS << "Invalid format for " << ElementName;
81+
}
82+
83+
std::error_code convertToErrorCode() const override {
84+
return llvm::inconvertibleErrorCode();
85+
}
86+
};
87+
88+
class InvalidRSMetadataValue : public ErrorInfo<InvalidRSMetadataValue> {
89+
public:
90+
static char ID;
91+
StringRef ParamName;
92+
93+
InvalidRSMetadataValue(StringRef ParamName) : ParamName(ParamName) {}
94+
95+
void log(raw_ostream &OS) const override {
96+
OS << "Invalid value for " << ParamName;
97+
}
98+
99+
std::error_code convertToErrorCode() const override {
100+
return llvm::inconvertibleErrorCode();
101+
}
102+
};
103+
29104
class MetadataBuilder {
30105
public:
31106
MetadataBuilder(llvm::LLVMContext &Ctx, ArrayRef<RootElement> Elements)
@@ -66,29 +141,27 @@ class MetadataParser {
66141
public:
67142
MetadataParser(MDNode *Root) : Root(Root) {}
68143

69-
LLVM_ABI bool ParseRootSignature(LLVMContext *Ctx,
70-
mcdxbc::RootSignatureDesc &RSD);
144+
LLVM_ABI llvm::Expected<llvm::mcdxbc::RootSignatureDesc>
145+
ParseRootSignature(uint32_t Version);
71146

72147
private:
73-
bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
74-
MDNode *RootFlagNode);
75-
bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
76-
MDNode *RootConstantNode);
77-
bool parseRootDescriptors(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
78-
MDNode *RootDescriptorNode,
79-
RootSignatureElementKind ElementKind);
80-
bool parseDescriptorRange(LLVMContext *Ctx, mcdxbc::DescriptorTable &Table,
81-
MDNode *RangeDescriptorNode);
82-
bool parseDescriptorTable(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
83-
MDNode *DescriptorTableNode);
84-
bool parseRootSignatureElement(LLVMContext *Ctx,
85-
mcdxbc::RootSignatureDesc &RSD,
86-
MDNode *Element);
87-
bool parseStaticSampler(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
88-
MDNode *StaticSamplerNode);
89-
90-
bool validateRootSignature(LLVMContext *Ctx,
91-
const llvm::mcdxbc::RootSignatureDesc &RSD);
148+
llvm::Error parseRootFlags(mcdxbc::RootSignatureDesc &RSD,
149+
MDNode *RootFlagNode);
150+
llvm::Error parseRootConstants(mcdxbc::RootSignatureDesc &RSD,
151+
MDNode *RootConstantNode);
152+
llvm::Error parseRootDescriptors(mcdxbc::RootSignatureDesc &RSD,
153+
MDNode *RootDescriptorNode,
154+
RootSignatureElementKind ElementKind);
155+
llvm::Error parseDescriptorRange(mcdxbc::DescriptorTable &Table,
156+
MDNode *RangeDescriptorNode);
157+
llvm::Error parseDescriptorTable(mcdxbc::RootSignatureDesc &RSD,
158+
MDNode *DescriptorTableNode);
159+
llvm::Error parseRootSignatureElement(mcdxbc::RootSignatureDesc &RSD,
160+
MDNode *Element);
161+
llvm::Error parseStaticSampler(mcdxbc::RootSignatureDesc &RSD,
162+
MDNode *StaticSamplerNode);
163+
164+
llvm::Error validateRootSignature(const llvm::mcdxbc::RootSignatureDesc &RSD);
92165

93166
MDNode *Root;
94167
};

0 commit comments

Comments
 (0)