33 return CI->getZExtValue();
40 return CI->getValueAPF().convertToFloat();
47 if (NodeText ==
nullptr)
57template <
class... Ts>
struct OverloadedVisit : Ts... {
58 using Ts::operator()...;
60template <
class... Ts> OverloadedVisit(Ts...) -> OverloadedVisit<Ts...>;
69 Space(
Range.RegisterSpace) {}
74 <<
", space=" <<
Range.Space <<
")";
81 FmtMDNode(
const MDNode *Node) : Node(Node) {}
84raw_ostream &
operator<<(llvm::raw_ostream &OS, FmtMDNode Fmt) {
85 Fmt.Node->printTree(OS);
89static Error makeRSError(
const Twine &Msg) {
94template <
typename T,
typename = std::enable_if_t<
96 std::is_same_v<std::underlying_type_t<T>, uint32_t>>>
102 return makeRSError(
formatv(
"Invalid value for {0}: {1}", ErrText, Val));
103 return static_cast<T>(*Val);
105 return makeRSError(
formatv(
"Invalid value for {0}:", ErrText));
109 const auto Visitor = OverloadedVisit{
111 return BuildRootFlags(Flags);
114 return BuildRootConstants(Constants);
117 return BuildRootDescriptor(Descriptor);
120 return BuildDescriptorTableClause(
Clause);
123 return BuildDescriptorTable(Table);
126 return BuildStaticSampler(Sampler);
131 MDNode *ElementMD = std::visit(Visitor, Element);
132 assert(ElementMD !=
nullptr &&
133 "Root Element must be initialized and validated");
134 GeneratedMetadata.push_back(ElementMD);
162MDNode *MetadataBuilder::BuildRootDescriptor(
const RootDescriptor &Descriptor) {
165 assert(!ResName.
empty() &&
"Provided an invalid Resource Class");
166 SmallString<7>
Name({
"Root", ResName});
179MDNode *MetadataBuilder::BuildDescriptorTable(
const DescriptorTable &Table) {
190 assert(Table.NumClauses <= GeneratedMetadata.size() &&
191 "Table expected all owned clauses to be generated already");
193 TableOperands.
append(GeneratedMetadata.end() - Table.NumClauses,
194 GeneratedMetadata.end());
196 GeneratedMetadata.pop_back_n(Table.NumClauses);
201MDNode *MetadataBuilder::BuildDescriptorTableClause(
205 assert(!ResName.
empty() &&
"Provided an invalid Resource Class");
217MDNode *MetadataBuilder::BuildStaticSampler(
const StaticSampler &Sampler) {
248Error MetadataParser::parseRootFlags(mcdxbc::RootSignatureDesc &RSD,
249 MDNode *RootFlagNode) {
251 return makeRSError(
"Invalid format for RootFlags Element");
256 return makeRSError(
"Invalid value for RootFlag");
261Error MetadataParser::parseRootConstants(mcdxbc::RootSignatureDesc &RSD,
262 MDNode *RootConstantNode) {
264 return makeRSError(
"Invalid format for RootConstants Element");
266 Expected<dxbc::ShaderVisibility> Visibility =
271 return Error(std::move(
E));
277 return makeRSError(
"Invalid value for ShaderRegister");
282 return makeRSError(
"Invalid value for RegisterSpace");
287 return makeRSError(
"Invalid value for Num32BitValues");
290 *Visibility, Constants);
295Error MetadataParser::parseRootDescriptors(
296 mcdxbc::RootSignatureDesc &RSD, MDNode *RootDescriptorNode,
301 "parseRootDescriptors should only be called with RootDescriptor "
304 return makeRSError(
"Invalid format for Root Descriptor Element");
307 switch (ElementKind) {
309 Type = dxbc::RootParameterType::SRV;
312 Type = dxbc::RootParameterType::UAV;
315 Type = dxbc::RootParameterType::CBV;
322 Expected<dxbc::ShaderVisibility> Visibility =
327 return Error(std::move(
E));
329 mcdxbc::RootDescriptor Descriptor;
333 return makeRSError(
"Invalid value for ShaderRegister");
338 return makeRSError(
"Invalid value for RegisterSpace");
341 Descriptor.
Flags = *Val;
343 return makeRSError(
"Invalid value for Root Descriptor Flags");
349Error MetadataParser::parseDescriptorRange(mcdxbc::DescriptorTable &Table,
350 MDNode *RangeDescriptorNode) {
352 return makeRSError(
"Invalid format for Descriptor Range");
354 mcdxbc::DescriptorRange
Range;
356 std::optional<StringRef> ElementText =
359 if (!ElementText.has_value())
360 return makeRSError(
"Invalid format for Descriptor Range");
362 if (*ElementText ==
"CBV")
364 else if (*ElementText ==
"SRV")
366 else if (*ElementText ==
"UAV")
368 else if (*ElementText ==
"Sampler")
371 return makeRSError(
formatv(
"Invalid Descriptor Range type.\n{0}",
372 FmtMDNode{RangeDescriptorNode}));
375 Range.NumDescriptors = *Val;
377 return makeRSError(
formatv(
"Invalid number of Descriptor in Range.\n{0}",
378 FmtMDNode{RangeDescriptorNode}));
381 Range.BaseShaderRegister = *Val;
383 return makeRSError(
"Invalid value for BaseShaderRegister");
386 Range.RegisterSpace = *Val;
388 return makeRSError(
"Invalid value for RegisterSpace");
391 Range.OffsetInDescriptorsFromTableStart = *Val;
393 return makeRSError(
"Invalid value for OffsetInDescriptorsFromTableStart");
398 return makeRSError(
"Invalid value for Descriptor Range Flags");
404Error MetadataParser::parseDescriptorTable(mcdxbc::RootSignatureDesc &RSD,
405 MDNode *DescriptorTableNode) {
406 const unsigned int NumOperands = DescriptorTableNode->
getNumOperands();
408 return makeRSError(
"Invalid format for Descriptor Table");
410 Expected<dxbc::ShaderVisibility> Visibility =
415 return Error(std::move(
E));
417 mcdxbc::DescriptorTable Table;
419 for (
unsigned int I = 2;
I < NumOperands;
I++) {
421 if (Element ==
nullptr)
422 return makeRSError(
formatv(
"Missing Root Element Metadata Node.\n{0}",
423 FmtMDNode{DescriptorTableNode}));
425 if (
auto Err = parseDescriptorRange(Table, Element))
434Error MetadataParser::parseStaticSampler(mcdxbc::RootSignatureDesc &RSD,
435 MDNode *StaticSamplerNode) {
437 return makeRSError(
"Invalid format for Static Sampler");
443 if (
auto E =
Filter.takeError())
444 return Error(std::move(
E));
447 Expected<dxbc::TextureAddressMode> AddressU =
451 return Error(std::move(
E));
454 Expected<dxbc::TextureAddressMode> AddressV =
458 return Error(std::move(
E));
461 Expected<dxbc::TextureAddressMode> AddressW =
465 return Error(std::move(
E));
471 return makeRSError(
"Invalid value for MipLODBias");
476 return makeRSError(
"Invalid value for MaxAnisotropy");
482 return Error(std::move(
E));
485 Expected<dxbc::StaticBorderColor> BorderColor =
489 return Error(std::move(
E));
490 Sampler.BorderColor = *BorderColor;
495 return makeRSError(
"Invalid value for MinLOD");
500 return makeRSError(
"Invalid value for MaxLOD");
505 return makeRSError(
"Invalid value for ShaderRegister");
510 return makeRSError(
"Invalid value for RegisterSpace");
512 Expected<dxbc::ShaderVisibility> Visibility =
517 return Error(std::move(
E));
518 Sampler.ShaderVisibility = *Visibility;
523 return makeRSError(
"Invalid value for Static Sampler Flags");
529Error MetadataParser::parseRootSignatureElement(mcdxbc::RootSignatureDesc &RSD,
532 if (!ElementText.has_value())
533 return makeRSError(
"Invalid format for Root Element");
536 StringSwitch<RootSignatureElementKind>(*ElementText)
546 switch (ElementKind) {
549 return parseRootFlags(RSD, Element);
551 return parseRootConstants(RSD, Element);
555 return parseRootDescriptors(RSD, Element, ElementKind);
557 return parseDescriptorTable(RSD, Element);
559 return parseStaticSampler(RSD, Element);
562 formatv(
"Invalid Root Signature Element\n{0}", FmtMDNode{Element}));
576 formatv(
"Samplers cannot be mixed with other resource types in a "
577 "descriptor table, {0}(location={1})",
578 getResourceClassName(CurrRC), Location));
579 CurrRC =
Range.RangeType;
588 bool IsPrevUnbound =
false;
591 if (
Range.NumDescriptors == 0)
595 Range.BaseShaderRegister,
Range.NumDescriptors);
599 formatv(
"Overflow for shader register range: {0}", FmtRange{
Range}));
606 if (IsPrevUnbound && IsAppending)
608 formatv(
"Range {0} cannot be appended after an unbounded range",
615 return makeRSError(
formatv(
"Offset overflow for descriptor range: {0}.",
626Error MetadataParser::validateRootSignature(
631 std::move(DeferredErrs),
632 makeRSError(
formatv(
"Invalid value for Version: {0}", RSD.
Version)));
637 std::move(DeferredErrs),
638 makeRSError(
formatv(
"Invalid value for RootFlags: {0}", RSD.
Flags)));
644 case dxbc::RootParameterType::Constants32Bit:
647 case dxbc::RootParameterType::CBV:
648 case dxbc::RootParameterType::UAV:
649 case dxbc::RootParameterType::SRV: {
654 std::move(DeferredErrs),
655 makeRSError(
formatv(
"Invalid value for ShaderRegister: {0}",
660 std::move(DeferredErrs),
661 makeRSError(
formatv(
"Invalid value for RegisterSpace: {0}",
670 std::move(DeferredErrs),
671 makeRSError(
formatv(
"Invalid value for RootDescriptorFlag: {0}",
675 case dxbc::RootParameterType::DescriptorTable: {
676 const mcdxbc::DescriptorTable &Table =
678 for (
const mcdxbc::DescriptorRange &
Range : Table) {
681 std::move(DeferredErrs),
682 makeRSError(
formatv(
"Invalid value for RegisterSpace: {0}",
683 Range.RegisterSpace)));
687 std::move(DeferredErrs),
688 makeRSError(
formatv(
"Invalid value for NumDescriptors: {0}",
689 Range.NumDescriptors)));
697 std::move(DeferredErrs),
698 makeRSError(
formatv(
"Invalid value for DescriptorFlag: {0}",
703 DeferredErrs =
joinErrors(std::move(DeferredErrs), std::move(Err));
707 DeferredErrs =
joinErrors(std::move(DeferredErrs), std::move(Err));
719 makeRSError(
formatv(
"Invalid value for MipLODBias: {0:e}",
725 makeRSError(
formatv(
"Invalid value for MaxAnisotropy: {0}",
731 makeRSError(
formatv(
"Invalid value for MinLOD: {0}",
737 makeRSError(
formatv(
"Invalid value for MaxLOD: {0}",
742 std::move(DeferredErrs),
743 makeRSError(
formatv(
"Invalid value for ShaderRegister: {0}",
749 makeRSError(
formatv(
"Invalid value for RegisterSpace: {0}",
757 std::move(DeferredErrs),
758 makeRSError(
formatv(
"Invalid value for Static Sampler Flag: {0}",
765Expected<mcdxbc::RootSignatureDesc>
770 for (
const auto &Operand : Root->operands()) {
772 if (Element ==
nullptr)
774 std::move(DeferredErrs),
775 makeRSError(
formatv(
"Missing Root Element Metadata Node.")));
777 if (
auto Err = parseRootSignatureElement(RSD, Element))
778 DeferredErrs =
joinErrors(std::move(DeferredErrs), std::move(Err));
781 if (
auto Err = validateRootSignature(RSD))
782 DeferredErrs =
joinErrors(std::move(DeferredErrs), std::move(Err));
785 return std::move(DeferredErrs);
787 return std::move(RSD);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Analysis containing CSE Info
mir Rename Register Operands
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Error takeError()
Take ownership of the stored error.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
const MDOperand & getOperand(unsigned I) const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned getNumOperands() const
Return number of MDNode operands.
LLVM_ABI StringRef getString() const
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Wrapper class representing virtual and physical registers.
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
An efficient, type-erasing, non-owning reference to a callable.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool isValidShaderVisibility(uint32_t V)
bool isValidSamplerFilter(uint32_t V)
bool isValidStaticSamplerFlags(uint32_t V)
bool isValidRootDesciptorFlags(uint32_t V)
bool isValidDescriptorRangeFlags(uint32_t V)
bool isValidBorderColor(uint32_t V)
bool isValidComparisonFunc(uint32_t V)
bool isValidAddress(uint32_t V)
LLVM_ABI StringRef getResourceClassName(ResourceClass RC)
static std::optional< uint32_t > extractMdIntValue(MDNode *Node, unsigned int OpId)
LLVM_ABI bool verifyRootDescriptorFlag(uint32_t Version, dxbc::RootDescriptorFlags Flags)
LLVM_ABI uint64_t computeRangeBound(uint64_t Offset, uint32_t Size)
static const uint32_t NumDescriptorsUnbounded
static Error validateDescriptorTableRegisterOverflow(const mcdxbc::DescriptorTable &Table, uint32_t Location)
LLVM_ABI bool verifyRegisterSpace(uint32_t RegisterSpace)
static const uint32_t DescriptorTableOffsetAppend
static Error validateDescriptorTableSamplerMixin(const mcdxbc::DescriptorTable &Table, uint32_t Location)
LLVM_ABI bool verifyVersion(uint32_t Version)
static std::optional< StringRef > extractMdStringValue(MDNode *Node, unsigned int OpId)
LLVM_ABI bool verifyStaticSamplerFlags(uint32_t Version, dxbc::StaticSamplerFlags Flags)
LLVM_ABI bool verifyRootFlag(uint32_t Flags)
LLVM_ABI bool verifyLOD(float LOD)
LLVM_ABI bool verifyDescriptorRangeFlag(uint32_t Version, dxil::ResourceClass Type, dxbc::DescriptorRangeFlags Flags)
std::variant< dxbc::RootFlags, RootConstants, RootDescriptor, DescriptorTable, DescriptorTableClause, StaticSampler > RootElement
Models RootElement : RootFlags | RootConstants | RootParam | DescriptorTable | DescriptorTableClause ...
LLVM_ABI bool verifyNoOverflowedOffset(uint64_t Offset)
LLVM_ABI bool verifyMipLODBias(float MipLODBias)
LLVM_ABI bool verifyNumDescriptors(uint32_t NumDescriptors)
LLVM_ABI raw_ostream & operator<<(raw_ostream &OS, const dxbc::RootFlags &Flags)
The following contains the serialization interface for root elements.
LLVM_ABI bool verifyMaxAnisotropy(uint32_t MaxAnisotropy)
static Expected< T > extractEnumValue(MDNode *Node, unsigned int OpId, StringRef ErrText, llvm::function_ref< bool(uint32_t)> VerifyFn)
LLVM_ABI bool verifyRegisterValue(uint32_t RegisterValue)
static std::optional< float > extractMdFloatValue(MDNode *Node, unsigned int OpId)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
FunctionAddr VTableAddr uintptr_t uintptr_t Version
Error joinErrors(Error E1, Error E2)
Concatenate errors.
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
SmallVector< DescriptorRange > Ranges
const RootDescriptor & getRootDescriptor(size_t Index) const
const DescriptorTable & getDescriptorTable(size_t Index) const
void addParameter(dxbc::RootParameterType Type, dxbc::ShaderVisibility Visibility, RootConstants Constant)
SmallVector< StaticSampler > StaticSamplers
mcdxbc::RootParametersContainer ParametersContainer