15#ifndef LLVM_OBJECT_DXCONTAINER_H
16#define LLVM_OBJECT_DXCONTAINER_H
40std::enable_if_t<std::is_arithmetic<T>::value,
void>
swapBytes(
T &value) {
45std::enable_if_t<std::is_class<T>::value,
void>
swapBytes(
T &value) {
117 iterator
begin()
const {
return iterator(*
this,
Data.begin()); }
119 iterator
end()
const {
return iterator(*
this,
Data.end()); }
150 return V->Header.ParameterType ==
151 (
uint32_t)dxbc::RootParameterType::Constants32Bit;
161 return (V->Header.ParameterType ==
163 V->Header.ParameterType ==
165 V->Header.ParameterType ==
172 if (
Error E = Descriptor.takeError())
195 return (V->Header.ParameterType ==
213 static_cast<size_t>(
Table.NumRanges) *
214 Table.Ranges.Stride);
235 using param_header_iterator =
250 return ParametersHeaders;
253 return StaticSamplers;
268 case dxbc::RootParameterType::Constants32Bit:
271 case dxbc::RootParameterType::CBV:
272 case dxbc::RootParameterType::SRV:
273 case dxbc::RootParameterType::UAV:
279 case dxbc::RootParameterType::DescriptorTable:
280 if (Header.ParameterOffset +
sizeof(
uint32_t) > EndOfSectionByte)
281 return parseFailed(
"Reading structure out of file bounds");
285 PartData.begin() + Header.ParameterOffset);
296 if (Header.ParameterOffset + DataSize > EndOfSectionByte)
297 return parseFailed(
"Reading structure out of file bounds");
316 InfoStruct BasicInfo;
317 ResourceArray Resources;
320 SigElementArray SigInputElements;
321 SigElementArray SigOutputElements;
322 SigElementArray SigPatchOrPrimElements;
324 std::array<ViewArray<uint32_t>, 4> OutputVectorMasks;
326 std::array<ViewArray<uint32_t>, 4> InputOutputMap;
350 const InfoStruct &
getInfo()
const {
return BasicInfo; }
353 if (
const auto *
P = std::get_if<dxbc::PSV::v3::RuntimeInfo>(&BasicInfo))
354 return static_cast<const T *
>(
P);
355 if (std::is_same<T, dxbc::PSV::v3::RuntimeInfo>::value)
358 if (
const auto *
P = std::get_if<dxbc::PSV::v2::RuntimeInfo>(&BasicInfo))
359 return static_cast<const T *
>(
P);
360 if (std::is_same<T, dxbc::PSV::v2::RuntimeInfo>::value)
363 if (
const auto *
P = std::get_if<dxbc::PSV::v1::RuntimeInfo>(&BasicInfo))
364 return static_cast<const T *
>(
P);
365 if (std::is_same<T, dxbc::PSV::v1::RuntimeInfo>::value)
368 if (
const auto *
P = std::get_if<dxbc::PSV::v0::RuntimeInfo>(&BasicInfo))
369 return static_cast<const T *
>(
P);
375 return SemanticIndexTable;
385 return SigPatchOrPrimElements;
390 return OutputVectorMasks[Idx];
397 return InputOutputMap[Idx];
407 return P->UsesViewID != 0;
413 return P->SigInputVectors;
425 return P->GeomData.SigPatchConstOrPrimVectors;
437 return Parameters.
begin();
441 return Parameters.
end();
446 Offset < StringTableOffset + StringTable.size() &&
447 "Offset out of range.");
452 return StringTable.slice(TableOffset, StringTable.find(
'\0', TableOffset));
455 bool isEmpty()
const {
return Parameters.isEmpty(); }
464 using DXILData = std::pair<dxbc::ProgramHeader, const char *>;
472 std::optional<DXILData> DXIL;
473 std::optional<DXILData> DebugDXIL;
474 std::optional<uint64_t> ShaderFeatureFlags;
475 std::optional<dxbc::ShaderHash> Hash;
476 std::optional<DirectX::PSVRuntimeInfo> PSVInfo;
477 std::optional<DirectX::RootSignature> RootSignature;
481 std::optional<mcdxbc::DebugName> DebugName;
482 std::optional<mcdxbc::CompilerVersion> VersionInfo;
483 std::optional<mcdxbc::SourceInfo> SourceInfo;
484 std::optional<StringRef> PrivateData;
487 Error parsePartOffsets();
517 : Container(
C), OffsetIt(It) {
518 if (OffsetIt == Container.PartOffsets.end())
519 updateIteratorImpl(Container.PartOffsets.back());
527 void updateIterator() {
528 if (OffsetIt != Container.PartOffsets.
end())
529 updateIteratorImpl(*OffsetIt);
538 if (OffsetIt == Container.PartOffsets.end())
546 PartIterator Tmp = *
this;
552 return OffsetIt ==
RHS.OffsetIt;
556 return OffsetIt !=
RHS.OffsetIt;
575 return Debug ? DebugDXIL : DXIL;
579 const auto &ProgramPart = DXIL ? DXIL : DebugDXIL;
582 return ProgramPart->first.ShaderKind;
590 return ShaderFeatureFlags;
596 return RootSignature;
599 const std::optional<DirectX::PSVRuntimeInfo> &
getPSVInfo()
const {
605 return OutputSignature;
608 return PatchConstantSignature;
627 using PartData = DXContainer::PartIterator::PartData;
652 void moveSectionNext(
DataRefImpl &Sec)
const override;
658 getSectionContents(
DataRefImpl Sec)
const override;
661 bool isSectionCompressed(
DataRefImpl Sec)
const override;
662 bool isSectionText(
DataRefImpl Sec)
const override;
663 bool isSectionData(
DataRefImpl Sec)
const override;
665 bool isSectionVirtual(
DataRefImpl Sec)
const override;
670 void moveRelocationNext(
DataRefImpl &Rel)
const override;
680 uint8_t getBytesInAddress()
const override;
681 StringRef getFileFormatName()
const override;
694 bool is64Bit()
const override {
return false; }
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static FeatureBitset getFeatures(MCSubtargetInfo &STI, StringRef CPU, StringRef TuneCPU, StringRef FS, StringTable ProcNames, ArrayRef< SubtargetSubTypeKV > ProcDesc, ArrayRef< SubtargetFeatureKV > ProcFeatures)
This file defines the SmallVector class.
static std::unique_ptr< PDBSymbol > getSymbolType(const PDBSymbol &Symbol)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
typename SuperClass::const_iterator const_iterator
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
A range adaptor for a pair of iterators.
StringRef getData() const
basic_symbol_iterator symbol_end() const override
static bool classof(const Binary *v)
const dxbc::Header & getHeader() const
bool isRelocatableObject() const override
True if this is a relocatable object (.o/.obj).
void moveSymbolNext(DataRefImpl &Symb) const override
const DXContainer & getDXContainer() const
bool is64Bit() const override
basic_symbol_iterator symbol_begin() const override
const PartData & operator*()
PartIterator operator++(int)
const PartData * operator->()
friend class DXContainerObjectFile
PartIterator & operator++()
bool operator!=(const PartIterator &RHS) const
bool operator==(const PartIterator &RHS) const
const std::optional< DXILData > & getDXIL(bool Debug) const
std::optional< uint64_t > getShaderFeatureFlags() const
const std::optional< DirectX::PSVRuntimeInfo > & getPSVInfo() const
const std::optional< mcdxbc::SourceInfo > & getSourceInfo() const
const std::optional< mcdxbc::CompilerVersion > & getCompilerVersionInfo() const
std::optional< uint16_t > getShaderKind() const
const dxbc::Header & getHeader() const
const DirectX::Signature & getInputSignature() const
std::pair< dxbc::ProgramHeader, const char * > DXILData
std::optional< DirectX::RootSignature > getRootSignature() const
StringRef getData() const
const std::optional< mcdxbc::DebugName > getDebugName() const
PartIterator begin() const
static LLVM_ABI Expected< DXContainer > create(MemoryBufferRef Object)
const std::optional< StringRef > & getPrivateData() const
friend class PartIterator
std::optional< dxbc::ShaderHash > getShaderHash() const
const DirectX::Signature & getOutputSignature() const
const DirectX::Signature & getPatchConstantSignature() const
uint32_t getResourceStride() const
ArrayRef< uint8_t > getOutputVectorCounts() const
ArrayRef< uint32_t > getSemanticIndexTable() const
ResourceArray getResources() const
ViewArray< uint32_t > getInputOutputMap(size_t Idx) const
uint8_t getPatchConstOrPrimVectorCount() const
LLVM_ABI uint8_t getSigInputCount() const
ViewArray< uint32_t > getPatchOrPrimMasks() const
LLVM_ABI uint8_t getSigPatchOrPrimCount() const
StringRef getStringTable() const
PSVRuntimeInfo(StringRef D)
ViewArray< uint32_t > getInputPatchMap() const
ViewArray< uint32_t > getOutputVectorMasks(size_t Idx) const
uint32_t getVersion() const
uint32_t getSigElementStride() const
SigElementArray getSigPatchOrPrimElements() const
LLVM_ABI Error parse(uint16_t ShaderKind)
SigElementArray getSigInputElements() const
uint32_t getResourceCount() const
uint8_t getInputVectorCount() const
LLVM_ABI uint8_t getSigOutputCount() const
SigElementArray getSigOutputElements() const
const InfoStruct & getInfo() const
ViewArray< uint32_t > getPatchOutputMap() const
const T * getInfoAs() const
llvm::Expected< RootParameterView > getParameter(const dxbc::RTS0::v1::RootParameterHeader &Header) const
uint32_t getVersion() const
llvm::iterator_range< samplers_iterator > samplers() const
uint32_t getFlags() const
uint32_t getStaticSamplersOffset() const
uint32_t getRootParametersOffset() const
RootSignature(StringRef PD)
uint32_t getNumStaticSamplers() const
llvm::iterator_range< param_header_iterator > param_headers() const
uint32_t getNumParameters() const
uint32_t getNumRootParameters() const
ViewArray< dxbc::ProgramSignatureElement >::iterator begin() const
LLVM_ABI Error initialize(StringRef Part)
ViewArray< dxbc::ProgramSignatureElement >::iterator end() const
StringRef getName(uint32_t Offset) const
This class implements an extremely fast bulk output stream that can only output to a stream.
static constexpr const StringLiteral & getSectionName(DebugSectionKind SectionKind)
Return the name of the section.
LLVM_ABI bool isValidParameterType(uint32_t V)
static Error parseFailed(const Twine &Msg)
std::enable_if_t< std::is_arithmetic< T >::value, void > swapBytes(T &value)
content_iterator< SectionRef > section_iterator
content_iterator< BasicSymbolRef > basic_symbol_iterator
content_iterator< RelocationRef > relocation_iterator
value_type read(const void *memory, endianness endian)
Read a value of a particular endianness from memory.
constexpr bool IsBigEndianHost
void swapByteOrder(T &Value)
This is an optimization pass for GlobalISel generic memory operations.
@ Debug
Register 'use' is for debugging purpose.
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
llvm::Expected< DescriptorTable< T > > read()
static bool classof(const RootParameterView *V)
ViewArray< T >::iterator begin() const
ViewArray< T >::iterator end() const
static bool classof(const RootParameterView *V)
llvm::Expected< dxbc::RTS0::v1::RootConstants > read()
llvm::Expected< dxbc::RTS0::v2::RootDescriptor > read(uint32_t Version)
static bool classof(const RootParameterView *V)
RootParameterView(const dxbc::RTS0::v1::RootParameterHeader &H, StringRef P)
Expected< T > readParameter()
const dxbc::RTS0::v1::RootParameterHeader & Header
bool operator!=(const iterator I)
iterator(const ViewArray &A, const char *C)
bool operator==(const iterator I)
iterator(const iterator &)=default
static constexpr uint32_t MaxStride()
ViewArray(StringRef D, size_t S)