@@ -28,164 +28,139 @@ class Metadata;
28
28
namespace hlsl {
29
29
namespace rootsig {
30
30
31
- template <typename T>
32
- class RootSignatureValidationError
33
- : public ErrorInfo<RootSignatureValidationError<T>> {
34
- public:
35
- static char ID;
36
- StringRef ParamName;
37
- T Value;
38
-
39
- RootSignatureValidationError (StringRef ParamName, T Value)
40
- : ParamName(ParamName), Value(Value) {}
41
-
42
- void log (raw_ostream &OS) const override {
43
- OS << " Invalid value for " << ParamName << " : " << Value;
44
- }
45
-
46
- std::error_code convertToErrorCode () const override {
47
- return llvm::inconvertibleErrorCode ();
48
- }
31
+ enum class ErrorKind {
32
+ Validation,
33
+ AppendAfterUnboundedRange,
34
+ ShaderRegisterOverflow,
35
+ OffsetOverflow,
36
+ SamplerMixin,
37
+ GenericMetadata,
38
+ InvalidMetadataFormat,
39
+ InvalidMetadataValue
49
40
};
50
41
51
- class OffsetAppendAfterOverflow : public ErrorInfo <OffsetAppendAfterOverflow> {
52
- public:
53
- static char ID;
54
- dxil::ResourceClass Type;
55
- uint32_t Register;
56
- uint32_t Space;
57
-
58
- OffsetAppendAfterOverflow (dxil::ResourceClass Type, uint32_t Register,
59
- uint32_t Space)
60
- : Type(Type), Register(Register), Space(Space) {}
61
-
62
- void log (raw_ostream &OS) const override {
63
- OS << " Range " << getResourceClassName (Type) << " (register=" << Register
42
+ template <typename T>
43
+ void formatImpl (raw_string_ostream &Buff,
44
+ std::integral_constant<ErrorKind, ErrorKind::Validation>,
45
+ StringRef ParamName, T Value) {
46
+ Buff << " Invalid value for: " << ParamName << " :" << Value;
47
+ }
48
+
49
+ void formatImpl (
50
+ raw_string_ostream &Buff,
51
+ std::integral_constant<ErrorKind, ErrorKind::AppendAfterUnboundedRange>,
52
+ dxil::ResourceClass Type, uint32_t Register, uint32_t Space) {
53
+ Buff << " Range " << getResourceClassName (Type) << " (register=" << Register
64
54
<< " , space=" << Space << " ) "
65
55
<< " cannot be appended after an unbounded range " ;
66
- }
67
-
68
- std::error_code convertToErrorCode () const override {
69
- return llvm::inconvertibleErrorCode ();
70
- }
71
- };
56
+ }
72
57
73
- class ShaderRegisterOverflowError
74
- : public ErrorInfo<ShaderRegisterOverflowError> {
75
- public:
76
- static char ID;
77
- dxil::ResourceClass Type;
78
- uint32_t Register;
79
- uint32_t Space;
80
-
81
- ShaderRegisterOverflowError (dxil::ResourceClass Type, uint32_t Register,
82
- uint32_t Space)
83
- : Type(Type), Register(Register), Space(Space) {}
84
-
85
- void log (raw_ostream &OS) const override {
86
- OS << " Overflow for shader register range: " << getResourceClassName (Type)
58
+ void formatImpl (
59
+ raw_string_ostream &Buff,
60
+ std::integral_constant<ErrorKind, ErrorKind::ShaderRegisterOverflow>,
61
+ dxil::ResourceClass Type, uint32_t Register, uint32_t Space) {
62
+ Buff << " Overflow for shader register range: " << getResourceClassName (Type)
87
63
<< " (register=" << Register << " , space=" << Space << " )." ;
88
- }
64
+ }
89
65
90
- std::error_code convertToErrorCode () const override {
91
- return llvm::inconvertibleErrorCode ();
92
- }
93
- };
94
-
95
- class OffsetOverflowError : public ErrorInfo <OffsetOverflowError> {
96
- public:
97
- static char ID;
98
- dxil::ResourceClass Type;
99
- uint32_t Register;
100
- uint32_t Space;
101
-
102
- OffsetOverflowError (dxil::ResourceClass Type, uint32_t Register,
103
- uint32_t Space)
104
- : Type(Type), Register(Register), Space(Space) {}
105
-
106
- void log (raw_ostream &OS) const override {
107
- OS << " Offset overflow for descriptor range: " << getResourceClassName (Type)
66
+ void formatImpl (raw_string_ostream &Buff,
67
+ std::integral_constant<ErrorKind, ErrorKind::OffsetOverflow>,
68
+ dxil::ResourceClass Type, uint32_t Register, uint32_t Space) {
69
+ Buff << " Offset overflow for descriptor range: " << getResourceClassName (Type)
108
70
<< " (register=" << Register << " , space=" << Space << " )." ;
109
- }
110
-
111
- std::error_code convertToErrorCode () const override {
112
- return llvm::inconvertibleErrorCode ();
113
- }
114
- };
115
-
116
- class TableSamplerMixinError : public ErrorInfo <TableSamplerMixinError> {
117
- public:
118
- static char ID;
119
- dxil::ResourceClass Type;
120
- uint32_t Location;
121
-
122
- TableSamplerMixinError (dxil::ResourceClass Type, uint32_t Location)
123
- : Type(Type), Location(Location) {}
71
+ }
124
72
125
- void log (raw_ostream &OS) const override {
126
- OS << " Samplers cannot be mixed with other "
73
+ void formatImpl (raw_string_ostream &Buff,
74
+ std::integral_constant<ErrorKind, ErrorKind::SamplerMixin>,
75
+ dxil::ResourceClass Type, uint32_t Location) {
76
+ Buff << " Samplers cannot be mixed with other "
127
77
<< " resource types in a descriptor table, " << getResourceClassName (Type)
128
78
<< " (location=" << Location << " )" ;
129
- }
130
-
131
- std::error_code convertToErrorCode () const override {
132
- return llvm::inconvertibleErrorCode ();
133
- }
134
- };
135
-
136
- class GenericRSMetadataError : public ErrorInfo <GenericRSMetadataError> {
137
- public:
138
- LLVM_ABI static char ID;
139
- StringRef Message;
140
- MDNode *MD;
141
-
142
- GenericRSMetadataError (StringRef Message, MDNode *MD)
143
- : Message(Message), MD(MD) {}
144
-
145
- void log (raw_ostream &OS) const override {
146
- OS << Message;
147
- if (MD) {
148
- OS << " \n " ;
149
- MD->printTree (OS);
150
- }
151
- }
152
-
153
- std::error_code convertToErrorCode () const override {
154
- return llvm::inconvertibleErrorCode ();
155
- }
156
- };
157
-
158
- class InvalidRSMetadataFormat : public ErrorInfo <InvalidRSMetadataFormat> {
159
- public:
160
- LLVM_ABI static char ID;
161
- StringRef ElementName;
162
-
163
- InvalidRSMetadataFormat (StringRef ElementName) : ElementName(ElementName) {}
164
-
165
- void log (raw_ostream &OS) const override {
166
- OS << " Invalid format for " << ElementName;
167
- }
168
-
169
- std::error_code convertToErrorCode () const override {
170
- return llvm::inconvertibleErrorCode ();
171
- }
172
- };
173
-
174
- class InvalidRSMetadataValue : public ErrorInfo <InvalidRSMetadataValue> {
175
- public:
176
- LLVM_ABI static char ID;
177
- StringRef ParamName;
178
-
179
- InvalidRSMetadataValue (StringRef ParamName) : ParamName(ParamName) {}
180
-
181
- void log (raw_ostream &OS) const override {
182
- OS << " Invalid value for " << ParamName;
183
- }
184
-
185
- std::error_code convertToErrorCode () const override {
186
- return llvm::inconvertibleErrorCode ();
187
- }
188
- };
79
+ }
80
+
81
+ void formatImpl (
82
+ raw_string_ostream &Buff,
83
+ std::integral_constant<ErrorKind, ErrorKind::InvalidMetadataFormat>,
84
+ StringRef ElementName) {
85
+ Buff << " Invalid format for " << ElementName;
86
+ }
87
+
88
+ void formatImpl (
89
+ raw_string_ostream &Buff,
90
+ std::integral_constant<ErrorKind, ErrorKind::InvalidMetadataValue>,
91
+ StringRef ParamName) {
92
+ Buff << " Invalid value for " << ParamName;
93
+ }
94
+
95
+ void formatImpl (raw_string_ostream &Buff,
96
+ std::integral_constant<ErrorKind, ErrorKind::GenericMetadata>,
97
+ StringRef Message, MDNode *MD) {
98
+ Buff << Message;
99
+ if (MD) {
100
+ Buff << " \n " ;
101
+ MD->printTree (Buff);
102
+ }
103
+ }
104
+
105
+ template <typename ... ArgsTs>
106
+ static void formatErrMsg (raw_string_ostream &Buff, ErrorKind Kind,
107
+ ArgsTs... Args) {
108
+ switch (Kind) {
109
+ case ErrorKind::Validation:
110
+ formatImpl (Buff, std::integral_constant<ErrorKind, ErrorKind::Validation>{},
111
+ Args...);
112
+ break ;
113
+ case ErrorKind::AppendAfterUnboundedRange:
114
+ formatImpl (Buff,
115
+ std::integral_constant<ErrorKind,
116
+ ErrorKind::AppendAfterUnboundedRange>{},
117
+ Args...);
118
+ break ;
119
+ case ErrorKind::ShaderRegisterOverflow:
120
+ formatImpl (
121
+ Buff,
122
+ std::integral_constant<ErrorKind, ErrorKind::ShaderRegisterOverflow>{},
123
+ Args...);
124
+ break ;
125
+ case ErrorKind::OffsetOverflow:
126
+ formatImpl (Buff,
127
+ std::integral_constant<ErrorKind, ErrorKind::OffsetOverflow>{},
128
+ Args...);
129
+ break ;
130
+ case ErrorKind::SamplerMixin:
131
+ formatImpl (Buff,
132
+ std::integral_constant<ErrorKind, ErrorKind::SamplerMixin>{},
133
+ Args...);
134
+ break ;
135
+ case ErrorKind::GenericMetadata:
136
+ formatImpl (Buff,
137
+ std::integral_constant<ErrorKind, ErrorKind::GenericMetadata>{},
138
+ Args...);
139
+ break ;
140
+
141
+ case ErrorKind::InvalidMetadataFormat:
142
+ formatImpl (
143
+ Buff,
144
+ std::integral_constant<ErrorKind, ErrorKind::InvalidMetadataFormat>{},
145
+ Args...);
146
+ break ;
147
+
148
+ case ErrorKind::InvalidMetadataValue:
149
+ formatImpl (
150
+ Buff,
151
+ std::integral_constant<ErrorKind, ErrorKind::InvalidMetadataValue>{},
152
+ Args...);
153
+ break ;
154
+ }
155
+ }
156
+
157
+ template <typename ... ArgsTs>
158
+ static llvm::Error createRSError (ErrorKind Kind, ArgsTs... Args) {
159
+ std::string Msg;
160
+ raw_string_ostream Buff (Msg);
161
+ formatErrMsg (Buff, Kind, Args...);
162
+ return createStringError (std::move (Buff.str ()), inconvertibleErrorCode ());
163
+ }
189
164
190
165
class MetadataBuilder {
191
166
public:
0 commit comments