LLVM: include/llvm/Object/DXContainer.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef LLVM_OBJECT_DXCONTAINER_H
16#define LLVM_OBJECT_DXCONTAINER_H
17
29#include
30#include
31#include
32#include
33
34namespace llvm {
36
38template
39std::enable_if_t<std::is_arithmetic::value, void> swapBytes(T &value) {
41}
42
43template
44std::enable_if_t<std::is_class::value, void> swapBytes(T &value) {
45 value.swapBytes();
46}
47}
48
49
50
51
52
56
59
64
69
73
75
76
77
79 std::memset(&Val, 0, sizeof(value_type));
81 return Val;
85 return Val;
86 }
87
93
96 ++*this;
97 return Tmp;
98 }
99
105
108 --*this;
109 return Tmp;
110 }
111
114 };
115
116 iterator begin() const { return iterator(*this, Data.begin()); }
117
118 iterator end() const { return iterator(*this, Data.end()); }
119
121
123};
124
129
132
134 T Struct;
138
139 memcpy(&Struct, ParamData.data(), sizeof(T));
140
142 Struct.swapBytes();
143 return Struct;
144 }
145};
146
149 return V->Header.ParameterType ==
150 (uint32_t)dxbc::RootParameterType::Constants32Bit;
151 }
152
156};
157
160 return (V->Header.ParameterType ==
162 V->Header.ParameterType ==
164 V->Header.ParameterType ==
166 }
167
171 if (Error E = Descriptor.takeError())
172 return E;
174 }
180 }
181};
191
194 return (V->Header.ParameterType ==
196 }
197
198
200 const char *Current = ParamData.begin();
202
206
210
213 return Table;
214 }
215};
216
220
222private:
225 uint32_t RootParametersOffset;
227 uint32_t StaticSamplersOffset;
232
233 using param_header_iterator =
236
237public:
239
248 return ParametersHeaders;
249 }
251 return StaticSamplers;
252 }
254
259 ? PartData.size()
261
263 return parseFailed("invalid parameter type");
264
266 case dxbc::RootParameterType::Constants32Bit:
268 break;
269 case dxbc::RootParameterType::CBV:
270 case dxbc::RootParameterType::SRV:
271 case dxbc::RootParameterType::UAV:
272 if (Version == 1)
274 else
276 break;
277 case dxbc::RootParameterType::DescriptorTable:
278 if (Header.ParameterOffset + sizeof(uint32_t) > EndOfSectionByte)
279 return parseFailed("Reading structure out of file bounds");
280
283 PartData.begin() + Header.ParameterOffset);
284 if (Version == 1)
286 else
288
289
290
292 break;
293 }
294 if (Header.ParameterOffset + DataSize > EndOfSectionByte)
295 return parseFailed("Reading structure out of file bounds");
296
299 return View;
300 }
301};
302
304
307
310 using InfoStruct =
314 InfoStruct BasicInfo;
315 ResourceArray Resources;
318 SigElementArray SigInputElements;
319 SigElementArray SigOutputElements;
320 SigElementArray SigPatchOrPrimElements;
321
322 std::array<ViewArray<uint32_t>, 4> OutputVectorMasks;
324 std::array<ViewArray<uint32_t>, 4> InputOutputMap;
327
328public:
330
331
333
337
345
347
348 const InfoStruct &getInfo() const { return BasicInfo; }
349
350 template const T *getInfoAs() const {
351 if (const auto *P = std::get_ifdxbc::PSV::v3::RuntimeInfo(&BasicInfo))
352 return static_cast<const T *>(P);
353 if (std::is_same<T, dxbc::PSV::v3::RuntimeInfo>::value)
354 return nullptr;
355
356 if (const auto *P = std::get_ifdxbc::PSV::v2::RuntimeInfo(&BasicInfo))
357 return static_cast<const T *>(P);
358 if (std::is_same<T, dxbc::PSV::v2::RuntimeInfo>::value)
359 return nullptr;
360
361 if (const auto *P = std::get_ifdxbc::PSV::v1::RuntimeInfo(&BasicInfo))
362 return static_cast<const T *>(P);
363 if (std::is_same<T, dxbc::PSV::v1::RuntimeInfo>::value)
364 return nullptr;
365
366 if (const auto *P = std::get_ifdxbc::PSV::v0::RuntimeInfo(&BasicInfo))
367 return static_cast<const T *>(P);
368 return nullptr;
369 }
370
373 return SemanticIndexTable;
374 }
375
379
383 return SigPatchOrPrimElements;
384 }
385
388 return OutputVectorMasks[Idx];
389 }
390
392
395 return InputOutputMap[Idx];
396 }
397
400
402
405 return P->UsesViewID != 0;
406 return false;
407 }
408
411 return P->SigInputVectors;
412 return 0;
413 }
414
420
423 return P->GeomData.SigPatchConstOrPrimVectors;
424 return 0;
425 }
426};
427
432
433public:
435 return Parameters.begin();
436 }
437
439 return Parameters.end();
440 }
441
444 Offset < StringTableOffset + StringTable.size() &&
445 "Offset out of range.");
446
447
448
450 return StringTable.slice(TableOffset, StringTable.find('\0', TableOffset));
451 }
452
453 bool isEmpty() const { return Parameters.isEmpty(); }
454
456};
457
458}
459
460class DXContainer {
461public:
462 using DXILData = std::pair<dxbc::ProgramHeader, const char *>;
463
464private:
466
470 std::optional DXIL;
471 std::optional<uint64_t> ShaderFeatureFlags;
472 std::optionaldxbc::ShaderHash Hash;
473 std::optionalDirectX::PSVRuntimeInfo PSVInfo;
474 std::optionalDirectX::RootSignature RootSignature;
478
479 Error parseHeader();
480 Error parsePartOffsets();
488
489public:
490
491
492
493 class PartIterator {
496 struct PartData {
500 } IteratorState;
501
504
507 : Container(C), OffsetIt(It) {
508 if (OffsetIt == Container.PartOffsets.end())
509 updateIteratorImpl(Container.PartOffsets.back());
510 else
511 updateIterator();
512 }
513
514
515
516
517 void updateIterator() {
518 if (OffsetIt != Container.PartOffsets.end())
519 updateIteratorImpl(*OffsetIt);
520 }
521
522
523
525
526 public:
528 if (OffsetIt == Container.PartOffsets.end())
529 return *this;
530 ++OffsetIt;
531 updateIterator();
532 return *this;
533 }
534
536 PartIterator Tmp = *this;
537 ++(*this);
538 return Tmp;
539 }
540
542 return OffsetIt == RHS.OffsetIt;
543 }
544
546 return OffsetIt != RHS.OffsetIt;
547 }
548
549 const PartData &operator*() { return IteratorState; }
550 const PartData *operator->() { return &IteratorState; }
551 };
552
556
558
561
563
564 const std::optional &getDXIL() const { return DXIL; }
565
567 return ShaderFeatureFlags;
568 }
569
570 std::optionaldxbc::ShaderHash getShaderHash() const { return Hash; }
571
573 return RootSignature;
574 }
575
576 const std::optionalDirectX::PSVRuntimeInfo &getPSVInfo() const {
577 return PSVInfo;
578 };
579
582 return OutputSignature;
583 }
585 return PatchConstantSignature;
586 }
587};
588
590private:
593
594 using PartData = DXContainer::PartIterator::PartData;
597
600 Container(C) {
602 Parts.push_back(P);
603 }
604
605public:
607
608 static bool classof(const Binary *v) { return v->isDXContainer(); }
609
611
616
619 void moveSectionNext(DataRefImpl &Sec) const override;
625 getSectionContents(DataRefImpl Sec) const override;
626
628 bool isSectionCompressed(DataRefImpl Sec) const override;
629 bool isSectionText(DataRefImpl Sec) const override;
630 bool isSectionData(DataRefImpl Sec) const override;
631 bool isSectionBSS(DataRefImpl Sec) const override;
632 bool isSectionVirtual(DataRefImpl Sec) const override;
633
636
637 void moveRelocationNext(DataRefImpl &Rel) const override;
641 void getRelocationTypeName(DataRefImpl Rel,
643
646
647 uint8_t getBytesInAddress() const override;
648 StringRef getFileFormatName() const override;
651
661 bool is64Bit() const override { return false; }
662
664};
665
666}
667}
668
669#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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 StringRef getSymbolName(SymbolKind SymKind)
static FeatureBitset getFeatures(MCSubtargetInfo &STI, StringRef CPU, StringRef TuneCPU, StringRef FS, ArrayRef< StringRef > ProcNames, ArrayRef< SubtargetSubTypeKV > ProcDesc, ArrayRef< SubtargetFeatureKV > ProcFeatures)
This file defines the SmallVector class.
static std::unique_ptr< PDBSymbol > getSymbolType(const PDBSymbol &Symbol)
ArrayRef - 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.
StringRef - 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...
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
A range adaptor for a pair of iterators.
StringRef getData() const
basic_symbol_iterator symbol_end() const override
Definition DXContainer.h:658
static bool classof(const Binary *v)
Definition DXContainer.h:608
const dxbc::Header & getHeader() const
Definition DXContainer.h:610
bool isRelocatableObject() const override
True if this is a relocatable object (.o/.obj).
Definition DXContainer.h:663
void moveSymbolNext(DataRefImpl &Symb) const override
Definition DXContainer.h:652
const DXContainer & getDXContainer() const
Definition DXContainer.h:606
friend class ObjectFile
Definition DXContainer.h:591
bool is64Bit() const override
Definition DXContainer.h:661
basic_symbol_iterator symbol_begin() const override
Definition DXContainer.h:655
Definition DXContainer.h:493
friend class DXContainer
Definition DXContainer.h:502
const PartData & operator*()
Definition DXContainer.h:549
PartIterator operator++(int)
Definition DXContainer.h:535
const PartData * operator->()
Definition DXContainer.h:550
friend class DXContainerObjectFile
Definition DXContainer.h:503
PartIterator & operator++()
Definition DXContainer.h:527
bool operator!=(const PartIterator &RHS) const
Definition DXContainer.h:545
bool operator==(const PartIterator &RHS) const
Definition DXContainer.h:541
Definition DXContainer.h:460
PartIterator end() const
Definition DXContainer.h:557
std::optional< uint64_t > getShaderFeatureFlags() const
Definition DXContainer.h:566
const std::optional< DXILData > & getDXIL() const
Definition DXContainer.h:564
const std::optional< DirectX::PSVRuntimeInfo > & getPSVInfo() const
Definition DXContainer.h:576
const dxbc::Header & getHeader() const
Definition DXContainer.h:562
const DirectX::Signature & getInputSignature() const
Definition DXContainer.h:580
std::pair< dxbc::ProgramHeader, const char * > DXILData
Definition DXContainer.h:462
std::optional< DirectX::RootSignature > getRootSignature() const
Definition DXContainer.h:572
StringRef getData() const
Definition DXContainer.h:559
PartIterator begin() const
Definition DXContainer.h:553
static LLVM_ABI Expected< DXContainer > create(MemoryBufferRef Object)
friend class PartIterator
Definition DXContainer.h:487
std::optional< dxbc::ShaderHash > getShaderHash() const
Definition DXContainer.h:570
const DirectX::Signature & getOutputSignature() const
Definition DXContainer.h:581
const DirectX::Signature & getPatchConstantSignature() const
Definition DXContainer.h:584
uint32_t getResourceStride() const
Definition DXContainer.h:346
ArrayRef< uint8_t > getOutputVectorCounts() const
Definition DXContainer.h:415
ArrayRef< uint32_t > getSemanticIndexTable() const
Definition DXContainer.h:372
ResourceArray getResources() const
Definition DXContainer.h:336
ViewArray< uint32_t > getInputOutputMap(size_t Idx) const
Definition DXContainer.h:393
uint8_t getPatchConstOrPrimVectorCount() const
Definition DXContainer.h:421
LLVM_ABI uint8_t getSigInputCount() const
ViewArray< uint32_t > getPatchOrPrimMasks() const
Definition DXContainer.h:391
LLVM_ABI uint8_t getSigPatchOrPrimCount() const
StringRef getStringTable() const
Definition DXContainer.h:371
bool usesViewID() const
Definition DXContainer.h:403
PSVRuntimeInfo(StringRef D)
Definition DXContainer.h:329
ViewArray< uint32_t > getInputPatchMap() const
Definition DXContainer.h:398
ViewArray< uint32_t > getOutputVectorMasks(size_t Idx) const
Definition DXContainer.h:386
uint32_t getSize() const
Definition DXContainer.h:334
uint32_t getVersion() const
Definition DXContainer.h:338
uint32_t getSigElementStride() const
Definition DXContainer.h:401
SigElementArray getSigPatchOrPrimElements() const
Definition DXContainer.h:382
LLVM_ABI Error parse(uint16_t ShaderKind)
SigElementArray getSigInputElements() const
Definition DXContainer.h:380
uint32_t getResourceCount() const
Definition DXContainer.h:335
uint8_t getInputVectorCount() const
Definition DXContainer.h:409
LLVM_ABI uint8_t getSigOutputCount() const
SigElementArray getSigOutputElements() const
Definition DXContainer.h:381
const InfoStruct & getInfo() const
Definition DXContainer.h:348
ViewArray< uint32_t > getPatchOutputMap() const
Definition DXContainer.h:399
const T * getInfoAs() const
Definition DXContainer.h:350
llvm::Expected< RootParameterView > getParameter(const dxbc::RTS0::v1::RootParameterHeader &Header) const
Definition DXContainer.h:256
uint32_t getVersion() const
Definition DXContainer.h:241
llvm::iterator_range< samplers_iterator > samplers() const
Definition DXContainer.h:250
uint32_t getFlags() const
Definition DXContainer.h:253
uint32_t getStaticSamplersOffset() const
Definition DXContainer.h:245
uint32_t getRootParametersOffset() const
Definition DXContainer.h:243
RootSignature(StringRef PD)
Definition DXContainer.h:238
uint32_t getNumStaticSamplers() const
Definition DXContainer.h:244
llvm::iterator_range< param_header_iterator > param_headers() const
Definition DXContainer.h:247
uint32_t getNumParameters() const
Definition DXContainer.h:242
uint32_t getNumRootParameters() const
Definition DXContainer.h:246
Definition DXContainer.h:428
bool isEmpty() const
Definition DXContainer.h:453
ViewArray< dxbc::ProgramSignatureElement >::iterator begin() const
Definition DXContainer.h:434
LLVM_ABI Error initialize(StringRef Part)
ViewArray< dxbc::ProgramSignatureElement >::iterator end() const
Definition DXContainer.h:438
StringRef getName(uint32_t Offset) const
Definition DXContainer.h:442
This class implements an extremely fast bulk output stream that can only output to a stream.
@ C
The default llvm calling convention, compatible with C.
static constexpr const StringLiteral & getSectionName(DebugSectionKind SectionKind)
Return the name of the section.
LLVM_ABI_FOR_TEST bool isValidParameterType(uint32_t V)
Definition DXContainer.h:125
static Error parseFailed(const Twine &Msg)
Definition DXContainer.h:217
std::enable_if_t< std::is_arithmetic< T >::value, void > swapBytes(T &value)
Definition DXContainer.h:39
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.
FunctionAddr VTableAddr uintptr_t uintptr_t DataSize
FunctionAddr VTableAddr uintptr_t uintptr_t Version
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.
Definition DXContainer.h:192
llvm::Expected< DescriptorTable< T > > read()
Definition DXContainer.h:199
static bool classof(const RootParameterView *V)
Definition DXContainer.h:193
Definition DXContainer.h:182
uint32_t NumRanges
Definition DXContainer.h:183
uint32_t RangesOffset
Definition DXContainer.h:184
ViewArray< T >::iterator begin() const
Definition DXContainer.h:187
ViewArray< T >::iterator end() const
Definition DXContainer.h:189
ViewArray< T > Ranges
Definition DXContainer.h:185
Definition DXContainer.h:147
static bool classof(const RootParameterView *V)
Definition DXContainer.h:148
llvm::Expected< dxbc::RTS0::v1::RootConstants > read()
Definition DXContainer.h:153
Definition DXContainer.h:158
llvm::Expected< dxbc::RTS0::v2::RootDescriptor > read(uint32_t Version)
Definition DXContainer.h:168
static bool classof(const RootParameterView *V)
Definition DXContainer.h:159
Definition DXContainer.h:126
RootParameterView(const dxbc::RTS0::v1::RootParameterHeader &H, StringRef P)
Definition DXContainer.h:130
Expected< T > readParameter()
Definition DXContainer.h:133
StringRef ParamData
Definition DXContainer.h:128
const dxbc::RTS0::v1::RootParameterHeader & Header
Definition DXContainer.h:127
Definition DXContainer.h:65
iterator operator--()
Definition DXContainer.h:100
iterator operator++()
Definition DXContainer.h:88
value_type operator*()
Definition DXContainer.h:74
bool operator!=(const iterator I)
Definition DXContainer.h:113
iterator operator--(int)
Definition DXContainer.h:106
uint32_t Stride
Definition DXContainer.h:67
iterator(const ViewArray &A, const char *C)
Definition DXContainer.h:70
iterator operator++(int)
Definition DXContainer.h:94
bool operator==(const iterator I)
Definition DXContainer.h:112
StringRef Data
Definition DXContainer.h:66
const char * Current
Definition DXContainer.h:68
iterator(const iterator &)=default
Definition DXContainer.h:53
static constexpr uint32_t MaxStride()
Definition DXContainer.h:61
iterator end() const
Definition DXContainer.h:118
ViewArray(StringRef D, size_t S)
Definition DXContainer.h:58
uint32_t Stride
Definition DXContainer.h:55
StringRef Data
Definition DXContainer.h:54
size_t size() const
Definition DXContainer.h:120
T value_type
Definition DXContainer.h:60
bool isEmpty() const
Definition DXContainer.h:122
iterator begin() const
Definition DXContainer.h:116