Skip to content

Commit 7436dfe

Browse files
author
joaosaffran
committed
moving to Metadata lib
1 parent 72de785 commit 7436dfe

11 files changed

+428
-597
lines changed

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

Lines changed: 115 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
#define LLVM_FRONTEND_HLSL_ROOTSIGNATUREMETADATA_H
1616

1717
#include "llvm/Frontend/HLSL/HLSLRootSignature.h"
18-
#include "llvm/MC/DXContainerRootSignature.h"
18+
#include "llvm/IR/Constants.h"
1919
#include "llvm/IR/Function.h"
20+
#include "llvm/MC/DXContainerRootSignature.h"
2021
#include "llvm/Support/Error.h"
22+
#include <cstdint>
2123
#include <unordered_map>
2224

2325
namespace llvm {
@@ -28,6 +30,96 @@ class Metadata;
2830
namespace hlsl {
2931
namespace rootsig {
3032

33+
inline std::optional<uint32_t> extractMdIntValue(MDNode *Node,
34+
unsigned int OpId) {
35+
if (auto *CI =
36+
mdconst::dyn_extract<ConstantInt>(Node->getOperand(OpId).get()))
37+
return CI->getZExtValue();
38+
return std::nullopt;
39+
}
40+
41+
inline std::optional<float> extractMdFloatValue(MDNode *Node,
42+
unsigned int OpId) {
43+
if (auto *CI = mdconst::dyn_extract<ConstantFP>(Node->getOperand(OpId).get()))
44+
return CI->getValueAPF().convertToFloat();
45+
return std::nullopt;
46+
}
47+
48+
inline std::optional<StringRef> extractMdStringValue(MDNode *Node,
49+
unsigned int OpId) {
50+
MDString *NodeText = dyn_cast<MDString>(Node->getOperand(OpId));
51+
if (NodeText == nullptr)
52+
return std::nullopt;
53+
return NodeText->getString();
54+
}
55+
56+
template <typename T>
57+
class RootSignatureValidationError
58+
: public ErrorInfo<RootSignatureValidationError<T>> {
59+
public:
60+
static char ID;
61+
std::string ParamName;
62+
T Value;
63+
64+
RootSignatureValidationError(StringRef ParamName, T Value)
65+
: ParamName(ParamName.str()), Value(Value) {}
66+
67+
void log(raw_ostream &OS) const override {
68+
OS << "Invalid value for " << ParamName << ": " << Value;
69+
}
70+
71+
std::error_code convertToErrorCode() const override {
72+
return llvm::inconvertibleErrorCode();
73+
}
74+
};
75+
76+
class GenericRSMetadataError : public ErrorInfo<GenericRSMetadataError> {
77+
public:
78+
static char ID;
79+
std::string Message;
80+
81+
GenericRSMetadataError(Twine Message) : Message(Message.str()) {}
82+
83+
void log(raw_ostream &OS) const override { OS << Message; }
84+
85+
std::error_code convertToErrorCode() const override {
86+
return llvm::inconvertibleErrorCode();
87+
}
88+
};
89+
90+
class InvalidRSMetadataFormat : public ErrorInfo<InvalidRSMetadataFormat> {
91+
public:
92+
static char ID;
93+
std::string ElementName;
94+
95+
InvalidRSMetadataFormat(StringRef ElementName)
96+
: ElementName(ElementName.str()) {}
97+
98+
void log(raw_ostream &OS) const override {
99+
OS << "Invalid format for " << ElementName;
100+
}
101+
102+
std::error_code convertToErrorCode() const override {
103+
return llvm::inconvertibleErrorCode();
104+
}
105+
};
106+
107+
class InvalidRSMetadataValue : public ErrorInfo<InvalidRSMetadataValue> {
108+
public:
109+
static char ID;
110+
std::string ParamName;
111+
112+
InvalidRSMetadataValue(StringRef ParamName) : ParamName(ParamName.str()) {}
113+
114+
void log(raw_ostream &OS) const override {
115+
OS << "Invalid value for " << ParamName;
116+
}
117+
118+
std::error_code convertToErrorCode() const override {
119+
return llvm::inconvertibleErrorCode();
120+
}
121+
};
122+
31123
class MetadataBuilder {
32124
public:
33125
MetadataBuilder(llvm::LLVMContext &Ctx, ArrayRef<RootElement> Elements)
@@ -66,22 +158,32 @@ enum class RootSignatureElementKind {
66158

67159
class MetadataParser {
68160
public:
69-
using MapT = SmallDenseMap<const Function *, llvm::mcdxbc::RootSignatureDesc>;
70-
MetadataParser(llvm::LLVMContext &Ctx, MDNode* Root): Ctx(Ctx), Root(Root) {}
161+
MetadataParser(MDNode *Root) : Root(Root) {}
71162

72163
/// Iterates through root signature and converts them into MapT
73-
LLVM_ABI llvm::Expected<MapT*> ParseRootSignature();
164+
LLVM_ABI llvm::Expected<llvm::mcdxbc::RootSignatureDesc>
165+
ParseRootSignature(uint32_t Version);
74166

75167
private:
76-
llvm::Error parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, MDNode *RootFlagNode);
77-
llvm::Error parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, MDNode *RootConstantNode);
78-
llvm::Error parseRootDescriptors(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, MDNode *RootDescriptorNode, RootSignatureElementKind ElementKind);
79-
llvm::Error parseDescriptorRange(LLVMContext *Ctx, mcdxbc::DescriptorTable &Table, MDNode *RangeDescriptorNode);
80-
llvm::Error parseDescriptorTable(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, MDNode *DescriptorTableNode);
81-
llvm::Error parseRootSignatureElement(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, MDNode *Element);
82-
llvm::Error parseStaticSampler(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, MDNode *StaticSamplerNode);
83-
llvm::LLVMContext &Ctx;
84-
MDNode* Root;
168+
llvm::Error parseRootFlags(mcdxbc::RootSignatureDesc &RSD,
169+
MDNode *RootFlagNode);
170+
llvm::Error parseRootConstants(mcdxbc::RootSignatureDesc &RSD,
171+
MDNode *RootConstantNode);
172+
llvm::Error parseRootDescriptors(mcdxbc::RootSignatureDesc &RSD,
173+
MDNode *RootDescriptorNode,
174+
RootSignatureElementKind ElementKind);
175+
llvm::Error parseDescriptorRange(mcdxbc::DescriptorTable &Table,
176+
MDNode *RangeDescriptorNode);
177+
llvm::Error parseDescriptorTable(mcdxbc::RootSignatureDesc &RSD,
178+
MDNode *DescriptorTableNode);
179+
llvm::Error parseRootSignatureElement(mcdxbc::RootSignatureDesc &RSD,
180+
MDNode *Element);
181+
llvm::Error parseStaticSampler(mcdxbc::RootSignatureDesc &RSD,
182+
MDNode *StaticSamplerNode);
183+
184+
llvm::Error validateRootSignature(const llvm::mcdxbc::RootSignatureDesc &RSD);
185+
186+
MDNode *Root;
85187
};
86188

87189
} // namespace rootsig

llvm/include/llvm/MC/DXContainerRootSignature.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#ifndef LLVM_MC_DXCONTAINERROOTSIGNATURE_H
10+
#define LLVM_MC_DXCONTAINERROOTSIGNATURE_H
11+
912
#include "llvm/BinaryFormat/DXContainer.h"
1013
#include <cstdint>
1114
#include <limits>
@@ -116,3 +119,5 @@ struct RootSignatureDesc {
116119
};
117120
} // namespace mcdxbc
118121
} // namespace llvm
122+
123+
#endif // LLVM_MC_DXCONTAINERROOTSIGNATURE_H

0 commit comments

Comments
 (0)