14
14
#ifndef LLVM_FRONTEND_HLSL_ROOTSIGNATUREMETADATA_H
15
15
#define LLVM_FRONTEND_HLSL_ROOTSIGNATUREMETADATA_H
16
16
17
+ #include " llvm/ADT/StringRef.h"
17
18
#include " llvm/Frontend/HLSL/HLSLRootSignature.h"
18
19
#include " llvm/IR/Constants.h"
19
20
#include " llvm/MC/DXContainerRootSignature.h"
@@ -26,6 +27,80 @@ class Metadata;
26
27
namespace hlsl {
27
28
namespace rootsig {
28
29
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
+
29
104
class MetadataBuilder {
30
105
public:
31
106
MetadataBuilder (llvm::LLVMContext &Ctx, ArrayRef<RootElement> Elements)
@@ -66,29 +141,27 @@ class MetadataParser {
66
141
public:
67
142
MetadataParser (MDNode *Root) : Root(Root) {}
68
143
69
- LLVM_ABI bool ParseRootSignature (LLVMContext *Ctx,
70
- mcdxbc::RootSignatureDesc &RSD );
144
+ LLVM_ABI llvm::Expected<llvm::mcdxbc::RootSignatureDesc>
145
+ ParseRootSignature ( uint32_t Version );
71
146
72
147
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);
92
165
93
166
MDNode *Root;
94
167
};
0 commit comments