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;
2627namespace hlsl {
2728namespace 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+
29104class MetadataBuilder {
30105public:
31106 MetadataBuilder (llvm::LLVMContext &Ctx, ArrayRef<RootElement> Elements)
@@ -66,29 +141,27 @@ class MetadataParser {
66141public:
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
72147private:
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