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) {

601 for (auto &P : 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