LLVM 22.0.0git
DXILResource.h
Go to the documentation of this file.
1//===- DXILResource.h - Representations of DXIL resources -------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_ANALYSIS_DXILRESOURCE_H
10#define LLVM_ANALYSIS_DXILRESOURCE_H
11
12#include "llvm/ADT/MapVector.h"
14#include "llvm/ADT/StringRef.h"
18#include "llvm/IR/PassManager.h"
19#include "llvm/Pass.h"
23#include <cstdint>
24
25namespace llvm {
26class CallInst;
27class DataLayout;
28class LLVMContext;
29class MDTuple;
30class Value;
31
33
34namespace dxil {
35
36// Returns the resource name from dx_resource_handlefrombinding or
37// dx_resource_handlefromimplicitbinding call
38LLVM_ABI StringRef getResourceNameFromBindingCall(CallInst *CI);
39
40/// The dx.RawBuffer target extension type
41///
42/// `target("dx.RawBuffer", Type, IsWriteable, IsROV)`
43class RawBufferExtType : public TargetExtType {
44public:
45 RawBufferExtType() = delete;
48
49 bool isStructured() const {
50 // TODO: We need to be more prescriptive here, but since there's some debate
51 // over whether byte address buffer should have a void type or an i8 type,
52 // accept either for now.
53 Type *Ty = getTypeParameter(0);
54 return !Ty->isVoidTy() && !Ty->isIntegerTy(8);
55 }
56
58 return isStructured() ? getTypeParameter(0) : nullptr;
59 }
60 bool isWriteable() const { return getIntParameter(0); }
61 bool isROV() const { return getIntParameter(1); }
62
63 static bool classof(const TargetExtType *T) {
64 return T->getName() == "dx.RawBuffer";
65 }
66 static bool classof(const Type *T) {
68 }
69};
70
71/// The dx.TypedBuffer target extension type
72///
73/// `target("dx.TypedBuffer", Type, IsWriteable, IsROV, IsSigned)`
74class TypedBufferExtType : public TargetExtType {
75public:
79
80 Type *getResourceType() const { return getTypeParameter(0); }
81 bool isWriteable() const { return getIntParameter(0); }
82 bool isROV() const { return getIntParameter(1); }
83 bool isSigned() const { return getIntParameter(2); }
84
85 static bool classof(const TargetExtType *T) {
86 return T->getName() == "dx.TypedBuffer";
87 }
88 static bool classof(const Type *T) {
90 }
91};
92
93/// The dx.Texture target extension type
94///
95/// `target("dx.Texture", Type, IsWriteable, IsROV, IsSigned, Dimension)`
96class TextureExtType : public TargetExtType {
97public:
98 TextureExtType() = delete;
99 TextureExtType(const TextureExtType &) = delete;
101
102 Type *getResourceType() const { return getTypeParameter(0); }
103 bool isWriteable() const { return getIntParameter(0); }
104 bool isROV() const { return getIntParameter(1); }
105 bool isSigned() const { return getIntParameter(2); }
107 return static_cast<dxil::ResourceKind>(getIntParameter(3));
108 }
109
110 static bool classof(const TargetExtType *T) {
111 return T->getName() == "dx.Texture";
112 }
113 static bool classof(const Type *T) {
115 }
116};
117
118/// The dx.MSTexture target extension type
119///
120/// `target("dx.MSTexture", Type, IsWriteable, Samples, IsSigned, Dimension)`
121class MSTextureExtType : public TargetExtType {
122public:
126
127 Type *getResourceType() const { return getTypeParameter(0); }
128 bool isWriteable() const { return getIntParameter(0); }
130 bool isSigned() const { return getIntParameter(2); }
132 return static_cast<dxil::ResourceKind>(getIntParameter(3));
133 }
134
135 static bool classof(const TargetExtType *T) {
136 return T->getName() == "dx.MSTexture";
137 }
138 static bool classof(const Type *T) {
140 }
141};
142
143/// The dx.FeedbackTexture target extension type
144///
145/// `target("dx.FeedbackTexture", FeedbackType, Dimension)`
146class FeedbackTextureExtType : public TargetExtType {
147public:
151
156 return static_cast<dxil::ResourceKind>(getIntParameter(1));
157 }
158
159 static bool classof(const TargetExtType *T) {
160 return T->getName() == "dx.FeedbackTexture";
161 }
162 static bool classof(const Type *T) {
164 }
165};
166
167/// The dx.CBuffer target extension type
168///
169/// `target("dx.CBuffer", <Type>, ...)`
170class CBufferExtType : public TargetExtType {
171public:
172 CBufferExtType() = delete;
175
176 Type *getResourceType() const { return getTypeParameter(0); }
177
178 static bool classof(const TargetExtType *T) {
179 return T->getName() == "dx.CBuffer";
180 }
181 static bool classof(const Type *T) {
183 }
184};
185
186/// The dx.Sampler target extension type
187///
188/// `target("dx.Sampler", SamplerType)`
189class SamplerExtType : public TargetExtType {
190public:
191 SamplerExtType() = delete;
194
196 return static_cast<dxil::SamplerType>(getIntParameter(0));
197 }
198
199 static bool classof(const TargetExtType *T) {
200 return T->getName() == "dx.Sampler";
201 }
202 static bool classof(const Type *T) {
204 }
205};
206
207class AnyResourceExtType : public TargetExtType {
208public:
212
219
220 static bool classof(const Type *T) {
222 }
223};
224
225/// The dx.Layout target extension type
226///
227/// `target("dx.Layout", <Type>, <size>, [offsets...])`
228class LayoutExtType : public TargetExtType {
229public:
230 LayoutExtType() = delete;
231 LayoutExtType(const LayoutExtType &) = delete;
233
234 Type *getWrappedType() const { return getTypeParameter(0); }
235 uint32_t getSize() const { return getIntParameter(0); }
236 uint32_t getOffsetOfElement(int I) const { return getIntParameter(I + 1); }
237
238 static bool classof(const TargetExtType *T) {
239 return T->getName() == "dx.Layout";
240 }
241 static bool classof(const Type *T) {
243 }
244};
245
246/// The dx.Padding target extension type
247///
248/// `target("dx.Padding", NumBytes)`
249class PaddingExtType : public TargetExtType {
250public:
251 PaddingExtType() = delete;
254
255 unsigned getNumBytes() const { return getIntParameter(0); }
256
257 static bool classof(const TargetExtType *T) {
258 return T->getName() == "dx.Padding";
259 }
260 static bool classof(const Type *T) {
262 }
263};
264
265//===----------------------------------------------------------------------===//
266
268public:
269 struct UAVInfo {
270 bool IsROV;
271
272 bool operator==(const UAVInfo &RHS) const { return IsROV == RHS.IsROV; }
273 bool operator!=(const UAVInfo &RHS) const { return !(*this == RHS); }
274 bool operator<(const UAVInfo &RHS) const { return IsROV < RHS.IsROV; }
275 };
276
277 struct StructInfo {
279 // Note: we store an integer here rather than using `MaybeAlign` because in
280 // GCC 7 MaybeAlign isn't trivial so having one in this union would delete
281 // our move constructor.
282 // See https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0602r4.html
284
285 bool operator==(const StructInfo &RHS) const {
286 return std::tie(Stride, AlignLog2) == std::tie(RHS.Stride, RHS.AlignLog2);
287 }
288 bool operator!=(const StructInfo &RHS) const { return !(*this == RHS); }
289 bool operator<(const StructInfo &RHS) const {
290 return std::tie(Stride, AlignLog2) < std::tie(RHS.Stride, RHS.AlignLog2);
291 }
292 };
293
294 struct TypedInfo {
298
299 bool operator==(const TypedInfo &RHS) const {
300 return std::tie(ElementTy, ElementCount) ==
301 std::tie(RHS.ElementTy, RHS.ElementCount);
302 }
303 bool operator!=(const TypedInfo &RHS) const { return !(*this == RHS); }
304 bool operator<(const TypedInfo &RHS) const {
305 return std::tie(ElementTy, ElementCount) <
306 std::tie(RHS.ElementTy, RHS.ElementCount);
307 }
308 };
309
310private:
311 TargetExtType *HandleTy;
312
315
316public:
318 const dxil::ResourceClass RC,
319 const dxil::ResourceKind Kind);
322
323 TargetExtType *getHandleTy() const { return HandleTy; }
325
326 // Conditions to check before accessing specific views.
327 LLVM_ABI bool isUAV() const;
328 LLVM_ABI bool isCBuffer() const;
329 LLVM_ABI bool isSampler() const;
330 LLVM_ABI bool isStruct() const;
331 LLVM_ABI bool isTyped() const;
332 LLVM_ABI bool isFeedback() const;
333 LLVM_ABI bool isMultiSample() const;
334
335 // Views into the type.
336 LLVM_ABI UAVInfo getUAV() const;
339 LLVM_ABI StructInfo getStruct(const DataLayout &DL) const;
340 LLVM_ABI TypedInfo getTyped() const;
343
345 dxil::ResourceKind getResourceKind() const { return Kind; }
346
347 LLVM_ABI bool operator==(const ResourceTypeInfo &RHS) const;
348 bool operator!=(const ResourceTypeInfo &RHS) const { return !(*this == RHS); }
349 LLVM_ABI bool operator<(const ResourceTypeInfo &RHS) const;
350
351 LLVM_ABI void print(raw_ostream &OS, const DataLayout &DL) const;
352};
353
354//===----------------------------------------------------------------------===//
355
362
364public:
370
371 bool operator==(const ResourceBinding &RHS) const {
372 return std::tie(RecordID, Space, LowerBound, Size) ==
373 std::tie(RHS.RecordID, RHS.Space, RHS.LowerBound, RHS.Size);
374 }
375 bool operator!=(const ResourceBinding &RHS) const {
376 return !(*this == RHS);
377 }
378 bool operator<(const ResourceBinding &RHS) const {
379 return std::tie(RecordID, Space, LowerBound, Size) <
380 std::tie(RHS.RecordID, RHS.Space, RHS.LowerBound, RHS.Size);
381 }
382 bool overlapsWith(const ResourceBinding &RHS) const {
383 if (Space != RHS.Space)
384 return false;
385 if (Size == UINT32_MAX)
386 return LowerBound < RHS.LowerBound;
387 return LowerBound + Size - 1 >= RHS.LowerBound;
388 }
389 };
390
391private:
392 ResourceBinding Binding;
393 TargetExtType *HandleTy;
394 StringRef Name;
395 GlobalVariable *Symbol = nullptr;
396
397public:
398 bool GloballyCoherent = false;
400
401 ResourceInfo(uint32_t RecordID, uint32_t Space, uint32_t LowerBound,
402 uint32_t Size, TargetExtType *HandleTy, StringRef Name = "",
403 GlobalVariable *Symbol = nullptr)
404 : Binding{RecordID, Space, LowerBound, Size}, HandleTy(HandleTy),
405 Name(Name), Symbol(Symbol) {}
406
407 void setBindingID(unsigned ID) { Binding.RecordID = ID; }
408
412
413 const ResourceBinding &getBinding() const { return Binding; }
414 TargetExtType *getHandleTy() const { return HandleTy; }
415 StringRef getName() const { return Name; }
416
417 bool hasSymbol() const { return Symbol; }
420
421 LLVM_ABI std::pair<uint32_t, uint32_t>
423
424 bool operator==(const ResourceInfo &RHS) const {
425 return std::tie(Binding, HandleTy, Symbol, Name) ==
426 std::tie(RHS.Binding, RHS.HandleTy, RHS.Symbol, RHS.Name);
427 }
428 bool operator!=(const ResourceInfo &RHS) const { return !(*this == RHS); }
429 bool operator<(const ResourceInfo &RHS) const {
430 return Binding < RHS.Binding;
431 }
432
434 const DataLayout &DL) const;
435};
436
437} // namespace dxil
438
439//===----------------------------------------------------------------------===//
440
443
444public:
445 LLVM_ABI bool invalidate(Module &M, const PreservedAnalyses &PA,
446 ModuleAnalysisManager::Invalidator &Inv);
447
449 auto It = Infos.find(Ty);
450 if (It != Infos.end())
451 return It->second;
452 auto [NewIt, Inserted] = Infos.try_emplace(Ty, Ty);
453 return NewIt->second;
454 }
455};
456
458 : public AnalysisInfoMixin<DXILResourceTypeAnalysis> {
460
461 LLVM_ABI static AnalysisKey Key;
462
463public:
465
467 // Running the pass just generates an empty map, which will be filled when
468 // users of the pass query the results.
469 return Result();
470 }
471};
472
475
476 virtual void anchor();
477
478public:
479 static char ID;
481
483 const DXILResourceTypeMap &getResourceTypeMap() const { return DRTM; }
484};
485
487
488//===----------------------------------------------------------------------===//
489
491 using CallMapTy = DenseMap<CallInst *, unsigned>;
492
494 CallMapTy CallMap;
495 unsigned FirstUAV = 0;
496 unsigned FirstCBuffer = 0;
497 unsigned FirstSampler = 0;
498 bool HasInvalidDirection = false;
499
500 /// Populate all the resource instance data.
501 void populate(Module &M, DXILResourceTypeMap &DRTM);
502 /// Populate the map given the resource binding calls in the given module.
503 void populateResourceInfos(Module &M, DXILResourceTypeMap &DRTM);
504 /// Analyze and populate the directions of the resource counters.
505 void populateCounterDirections(Module &M);
506
507 /// Resolves a resource handle into a vector of ResourceInfos that
508 /// represent the possible unique creations of the handle. Certain cases are
509 /// ambiguous so multiple creation instructions may be returned. The resulting
510 /// ResourceInfo can be used to depuplicate unique handles that
511 /// reference the same resource
513
514public:
517
518 iterator begin() { return Infos.begin(); }
519 const_iterator begin() const { return Infos.begin(); }
520 iterator end() { return Infos.end(); }
521 const_iterator end() const { return Infos.end(); }
522
523 bool empty() const { return Infos.empty(); }
524
526 auto Pos = CallMap.find(Key);
527 return Pos == CallMap.end() ? Infos.end() : (Infos.begin() + Pos->second);
528 }
529
531 auto Pos = CallMap.find(Key);
532 return Pos == CallMap.end() ? Infos.end() : (Infos.begin() + Pos->second);
533 }
534
535 iterator srv_begin() { return begin(); }
536 const_iterator srv_begin() const { return begin(); }
537 iterator srv_end() { return begin() + FirstUAV; }
538 const_iterator srv_end() const { return begin() + FirstUAV; }
543
544 iterator uav_begin() { return begin() + FirstUAV; }
545 const_iterator uav_begin() const { return begin() + FirstUAV; }
546 iterator uav_end() { return begin() + FirstCBuffer; }
547 const_iterator uav_end() const { return begin() + FirstCBuffer; }
552
553 iterator cbuffer_begin() { return begin() + FirstCBuffer; }
554 const_iterator cbuffer_begin() const { return begin() + FirstCBuffer; }
555 iterator cbuffer_end() { return begin() + FirstSampler; }
556 const_iterator cbuffer_end() const { return begin() + FirstSampler; }
563
564 iterator sampler_begin() { return begin() + FirstSampler; }
565 const_iterator sampler_begin() const { return begin() + FirstSampler; }
566 iterator sampler_end() { return end(); }
567 const_iterator sampler_end() const { return end(); }
574
576 : iterator_adaptor_base<call_iterator, CallMapTy::iterator> {
577 call_iterator() = default;
580
581 CallInst *operator*() const { return I->first; }
582 };
583
584 call_iterator call_begin() { return call_iterator(CallMap.begin()); }
585 call_iterator call_end() { return call_iterator(CallMap.end()); }
589
590 bool hasInvalidCounterDirection() const { return HasInvalidDirection; }
591
593 const DataLayout &DL) const;
594
597};
598
599class DXILResourceAnalysis : public AnalysisInfoMixin<DXILResourceAnalysis> {
601
602 LLVM_ABI static AnalysisKey Key;
603
604public:
606
607 /// Gather resource info for the module \c M.
609};
610
611/// Printer pass for the \c DXILResourceAnalysis results.
612class DXILResourcePrinterPass : public PassInfoMixin<DXILResourcePrinterPass> {
613 raw_ostream &OS;
614
615public:
616 explicit DXILResourcePrinterPass(raw_ostream &OS) : OS(OS) {}
617
619
620 static bool isRequired() { return true; }
621};
622
624 std::unique_ptr<DXILResourceMap> Map;
626
627public:
628 static char ID; // Class identification, replacement for typeinfo
629
632
633 const DXILResourceMap &getResourceMap() const { return *Map; }
634 DXILResourceMap &getResourceMap() { return *Map; }
635
636 void getAnalysisUsage(AnalysisUsage &AU) const override;
637 bool runOnModule(Module &M) override;
638 void releaseMemory() override;
639
640 void print(raw_ostream &OS, const Module *M) const override;
641 void dump() const;
642};
643
645
646//===----------------------------------------------------------------------===//
647
648// DXILResourceBindingInfo stores the results of DXILResourceBindingAnalysis
649// which analyses all llvm.dx.resource.handlefrombinding calls in the module
650// and puts together lists of used virtual register spaces and available
651// virtual register slot ranges for each binding type.
652// It also stores additional information found during the analysis such as
653// whether the module uses implicit bindings or if any of the bindings overlap.
654//
655// This information will be used in DXILResourceImplicitBindings pass to assign
656// register slots to resources with implicit bindings, and in a
657// post-optimization validation pass that will raise diagnostic about
658// overlapping bindings.
660 hlsl::BindingInfo Bindings;
661 bool HasImplicitBinding = false;
662 bool HasOverlappingBinding = false;
663
664 // Populate the resource binding info given explicit resource binding calls
665 // in the module.
666 void populate(Module &M, DXILResourceTypeMap &DRTM);
667
668public:
669 bool hasImplicitBinding() const { return HasImplicitBinding; }
670 void setHasImplicitBinding(bool Value) { HasImplicitBinding = Value; }
671 bool hasOverlappingBinding() const { return HasOverlappingBinding; }
672 void setHasOverlappingBinding(bool Value) { HasOverlappingBinding = Value; }
673
674 std::optional<uint32_t> findAvailableBinding(dxil::ResourceClass RC,
675 uint32_t Space, int32_t Size) {
676 return Bindings.findAvailableBinding(RC, Space, Size);
677 }
678
681};
682
684 : public AnalysisInfoMixin<DXILResourceBindingAnalysis> {
686
687 LLVM_ABI static AnalysisKey Key;
688
689public:
691
693};
694
696 std::unique_ptr<DXILResourceBindingInfo> BindingInfo;
697
698public:
699 static char ID;
700
703
704 DXILResourceBindingInfo &getBindingInfo() { return *BindingInfo; }
705 const DXILResourceBindingInfo &getBindingInfo() const { return *BindingInfo; }
706
707 void getAnalysisUsage(AnalysisUsage &AU) const override;
708 bool runOnModule(Module &M) override;
709 void releaseMemory() override;
710};
711
713
714} // namespace llvm
715
716#endif // LLVM_ANALYSIS_DXILRESOURCE_H
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
#define LLVM_ABI
Definition Compiler.h:213
DXIL Resource Implicit Binding
This header defines various interfaces for pass management in LLVM.
#define I(x, y, z)
Definition MD5.cpp:58
This file implements a map that provides insertion order iteration.
#define T
This file defines the SmallVector class.
Value * RHS
Represent the analysis usage information of a pass.
This class represents a function call, abstracting a target machine's calling convention.
LLVM_ABI DXILResourceMap run(Module &M, ModuleAnalysisManager &AM)
Gather resource info for the module M.
DXILResourceBindingInfo Result
LLVM_ABI DXILResourceBindingInfo run(Module &M, ModuleAnalysisManager &AM)
friend class DXILResourceBindingWrapperPass
void setHasImplicitBinding(bool Value)
std::optional< uint32_t > findAvailableBinding(dxil::ResourceClass RC, uint32_t Space, int32_t Size)
friend class DXILResourceBindingAnalysis
void setHasOverlappingBinding(bool Value)
const DXILResourceBindingInfo & getBindingInfo() const
DXILResourceBindingInfo & getBindingInfo()
const_iterator sampler_end() const
iterator find(const CallInst *Key)
bool hasInvalidCounterDirection() const
const_iterator find(const CallInst *Key) const
iterator_range< iterator > samplers()
iterator_range< const_iterator > uavs() const
friend class DXILResourceAnalysis
const_iterator cbuffer_end() const
iterator_range< const_iterator > srvs() const
call_iterator call_begin()
const_iterator uav_begin() const
const_iterator begin() const
iterator_range< const_iterator > samplers() const
LLVM_ABI void print(raw_ostream &OS, DXILResourceTypeMap &DRTM, const DataLayout &DL) const
call_iterator call_end()
const_iterator srv_begin() const
iterator_range< iterator > srvs()
iterator_range< iterator > cbuffers()
iterator_range< iterator > uavs()
iterator_range< call_iterator > calls()
const_iterator uav_end() const
const_iterator sampler_begin() const
SmallVector< dxil::ResourceInfo >::iterator iterator
friend class DXILResourceWrapperPass
const_iterator cbuffer_begin() const
const_iterator srv_end() const
iterator_range< const_iterator > cbuffers() const
SmallVector< dxil::ResourceInfo >::const_iterator const_iterator
const_iterator end() const
DXILResourcePrinterPass(raw_ostream &OS)
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
DXILResourceTypeMap run(Module &M, ModuleAnalysisManager &AM)
dxil::ResourceTypeInfo & operator[](TargetExtType *Ty)
LLVM_ABI bool invalidate(Module &M, const PreservedAnalyses &PA, ModuleAnalysisManager::Invalidator &Inv)
DXILResourceTypeMap & getResourceTypeMap()
const DXILResourceTypeMap & getResourceTypeMap() const
DXILResourceMap & getResourceMap()
const DXILResourceMap & getResourceMap() const
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:74
ImmutablePass(char &pid)
Definition Pass.h:287
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tuple of metadata.
Definition Metadata.h:1497
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
Definition Pass.h:255
ModulePass(char &pid)
Definition Pass.h:257
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
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.
Definition StringRef.h:55
Class to represent struct types.
Class to represent target extensions types, which are generally unintrospectable from target-independ...
Type * getTypeParameter(unsigned i) const
unsigned getIntParameter(unsigned i) const
Type(LLVMContext &C, TypeID tid)
Definition Type.h:93
LLVM Value Representation.
Definition Value.h:75
static bool classof(const Type *T)
AnyResourceExtType & operator=(const AnyResourceExtType &)=delete
static bool classof(const TargetExtType *T)
AnyResourceExtType(const AnyResourceExtType &)=delete
static bool classof(const TargetExtType *T)
CBufferExtType & operator=(const CBufferExtType &)=delete
CBufferExtType(const CBufferExtType &)=delete
static bool classof(const Type *T)
Type * getResourceType() const
dxil::SamplerFeedbackType getFeedbackType() const
FeedbackTextureExtType(const FeedbackTextureExtType &)=delete
dxil::ResourceKind getDimension() const
FeedbackTextureExtType & operator=(const FeedbackTextureExtType &)=delete
static bool classof(const TargetExtType *T)
static bool classof(const Type *T)
static bool classof(const Type *T)
LayoutExtType(const LayoutExtType &)=delete
uint32_t getSize() const
LayoutExtType & operator=(const LayoutExtType &)=delete
static bool classof(const TargetExtType *T)
uint32_t getOffsetOfElement(int I) const
Type * getWrappedType() const
dxil::ResourceKind getDimension() const
MSTextureExtType(const MSTextureExtType &)=delete
static bool classof(const TargetExtType *T)
uint32_t getSampleCount() const
static bool classof(const Type *T)
MSTextureExtType & operator=(const MSTextureExtType &)=delete
static bool classof(const TargetExtType *T)
PaddingExtType & operator=(const PaddingExtType &)=delete
PaddingExtType(const PaddingExtType &)=delete
unsigned getNumBytes() const
static bool classof(const Type *T)
static bool classof(const TargetExtType *T)
RawBufferExtType(const RawBufferExtType &)=delete
static bool classof(const Type *T)
RawBufferExtType & operator=(const RawBufferExtType &)=delete
StringRef getName() const
bool operator<(const ResourceInfo &RHS) const
bool operator!=(const ResourceInfo &RHS) const
TargetExtType * getHandleTy() const
LLVM_ABI std::pair< uint32_t, uint32_t > getAnnotateProps(Module &M, dxil::ResourceTypeInfo &RTI) const
LLVM_ABI void print(raw_ostream &OS, dxil::ResourceTypeInfo &RTI, const DataLayout &DL) const
ResourceInfo(uint32_t RecordID, uint32_t Space, uint32_t LowerBound, uint32_t Size, TargetExtType *HandleTy, StringRef Name="", GlobalVariable *Symbol=nullptr)
void setBindingID(unsigned ID)
bool operator==(const ResourceInfo &RHS) const
const ResourceBinding & getBinding() const
LLVM_ABI GlobalVariable * createSymbol(Module &M, StructType *Ty)
LLVM_ABI MDTuple * getAsMetadata(Module &M, dxil::ResourceTypeInfo &RTI) const
ResourceCounterDirection CounterDirection
dxil::ResourceClass getResourceClass() const
LLVM_ABI uint32_t getMultiSampleCount() const
LLVM_ABI uint32_t getCBufferSize(const DataLayout &DL) const
LLVM_ABI bool operator<(const ResourceTypeInfo &RHS) const
LLVM_ABI bool isUAV() const
LLVM_ABI bool isMultiSample() const
LLVM_ABI bool isSampler() const
LLVM_ABI bool isTyped() const
LLVM_ABI dxil::SamplerType getSamplerType() const
LLVM_ABI ResourceTypeInfo(TargetExtType *HandleTy, const dxil::ResourceClass RC, const dxil::ResourceKind Kind)
LLVM_ABI bool isCBuffer() const
LLVM_ABI TypedInfo getTyped() const
bool operator!=(const ResourceTypeInfo &RHS) const
LLVM_ABI StructType * createElementStruct(StringRef CBufferName="")
TargetExtType * getHandleTy() const
LLVM_ABI bool isFeedback() const
ResourceTypeInfo(TargetExtType *HandleTy)
LLVM_ABI UAVInfo getUAV() const
LLVM_ABI StructInfo getStruct(const DataLayout &DL) const
LLVM_ABI bool isStruct() const
LLVM_ABI dxil::SamplerFeedbackType getFeedbackType() const
LLVM_ABI bool operator==(const ResourceTypeInfo &RHS) const
dxil::ResourceKind getResourceKind() const
LLVM_ABI void print(raw_ostream &OS, const DataLayout &DL) const
SamplerExtType(const SamplerExtType &)=delete
static bool classof(const Type *T)
dxil::SamplerType getSamplerType() const
SamplerExtType & operator=(const SamplerExtType &)=delete
static bool classof(const TargetExtType *T)
static bool classof(const TargetExtType *T)
dxil::ResourceKind getDimension() const
Type * getResourceType() const
TextureExtType & operator=(const TextureExtType &)=delete
TextureExtType(const TextureExtType &)=delete
static bool classof(const Type *T)
TypedBufferExtType & operator=(const TypedBufferExtType &)=delete
static bool classof(const TargetExtType *T)
TypedBufferExtType(const TypedBufferExtType &)=delete
static bool classof(const Type *T)
BindingInfo represents the ranges of bindings and free space for each dxil::ResourceClass.
Definition HLSLBinding.h:46
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
ResourceKind
The kind of resource for an SRV or UAV resource.
Definition DXILABI.h:36
SamplerFeedbackType
Definition DXILABI.h:96
ElementType
The element type of an SRV or UAV resource.
Definition DXILABI.h:60
LLVM_ABI StringRef getResourceNameFromBindingCall(CallInst *CI)
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
LLVM_ABI ModulePass * createDXILResourceBindingWrapperPassPass()
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI ModulePass * createDXILResourceTypeWrapperPassPass()
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1867
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI ModulePass * createDXILResourceWrapperPassPass()
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:867
A CRTP mix-in that provides informational APIs needed for analysis passes.
Definition PassManager.h:93
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
call_iterator(CallMapTy::iterator Iter)
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition PassManager.h:70
bool operator!=(const ResourceBinding &RHS) const
bool operator==(const ResourceBinding &RHS) const
bool overlapsWith(const ResourceBinding &RHS) const
bool operator<(const ResourceBinding &RHS) const
bool operator==(const StructInfo &RHS) const
bool operator!=(const StructInfo &RHS) const
bool operator<(const StructInfo &RHS) const
bool operator<(const TypedInfo &RHS) const
bool operator==(const TypedInfo &RHS) const
bool operator!=(const TypedInfo &RHS) const
bool operator!=(const UAVInfo &RHS) const
bool operator==(const UAVInfo &RHS) const
bool operator<(const UAVInfo &RHS) const