@@ -216,6 +216,81 @@ ResourceTypeInfo::ResourceTypeInfo(TargetExtType *HandleTy,
216216 llvm_unreachable (" Unknown handle type" );
217217}
218218
219+ static void formatTypeName (SmallString<64 > &Dest, StringRef Name,
220+ bool isWriteable, bool isROV) {
221+ Dest = isWriteable ? (isROV ? " RasterizerOrdered" : " RW" ) : " " ;
222+ Dest += Name;
223+ }
224+
225+ StructType *ResourceTypeInfo::createElementStruct () {
226+ SmallString<64 > TypeName;
227+
228+ switch (Kind) {
229+ case ResourceKind::Texture1D:
230+ case ResourceKind::Texture2D:
231+ case ResourceKind::Texture3D:
232+ case ResourceKind::TextureCube:
233+ case ResourceKind::Texture1DArray:
234+ case ResourceKind::Texture2DArray:
235+ case ResourceKind::TextureCubeArray: {
236+ auto *RTy = cast<TextureExtType>(HandleTy);
237+ formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
238+ RTy->isROV ());
239+ return StructType::create (RTy->getResourceType (), TypeName);
240+ }
241+ case ResourceKind::Texture2DMS:
242+ case ResourceKind::Texture2DMSArray: {
243+ auto *RTy = cast<MSTextureExtType>(HandleTy);
244+ formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
245+ /* IsROV=*/ false );
246+ return StructType::create (RTy->getResourceType (), TypeName);
247+ }
248+ case ResourceKind::TypedBuffer: {
249+ auto *RTy = cast<TypedBufferExtType>(HandleTy);
250+ formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
251+ RTy->isROV ());
252+ return StructType::create (RTy->getResourceType (), TypeName);
253+ }
254+ case ResourceKind::RawBuffer: {
255+ auto *RTy = cast<RawBufferExtType>(HandleTy);
256+ formatTypeName (TypeName, " ByteAddressBuffer" , RTy->isWriteable (),
257+ RTy->isROV ());
258+ return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
259+ TypeName);
260+ }
261+ case ResourceKind::StructuredBuffer: {
262+ auto *RTy = cast<RawBufferExtType>(HandleTy);
263+ formatTypeName (TypeName, " StructuredBuffer" , RTy->isWriteable (),
264+ RTy->isROV ());
265+ return StructType::create (RTy->getResourceType (), TypeName);
266+ }
267+ case ResourceKind::FeedbackTexture2D:
268+ case ResourceKind::FeedbackTexture2DArray: {
269+ auto *RTy = cast<FeedbackTextureExtType>(HandleTy);
270+ TypeName = formatv (" {0}<{1}>" , getResourceKindName (Kind),
271+ llvm::to_underlying (RTy->getFeedbackType ()));
272+ return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
273+ TypeName);
274+ }
275+ case ResourceKind::CBuffer:
276+ return StructType::create (HandleTy->getContext (), " cbuffer" );
277+ case ResourceKind::Sampler: {
278+ auto *RTy = cast<SamplerExtType>(HandleTy);
279+ TypeName = formatv (" SamplerState<{0}>" ,
280+ llvm::to_underlying (RTy->getSamplerType ()));
281+ return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
282+ TypeName);
283+ }
284+ case ResourceKind::TBuffer:
285+ case ResourceKind::RTAccelerationStructure:
286+ llvm_unreachable (" Unhandled resource kind" );
287+ case ResourceKind::Invalid:
288+ case ResourceKind::NumEntries:
289+ llvm_unreachable (" Invalid resource kind" );
290+ }
291+ llvm_unreachable (" Unhandled ResourceKind enum" );
292+ }
293+
219294bool ResourceTypeInfo::isUAV () const { return RC == ResourceClass::UAV; }
220295
221296bool ResourceTypeInfo::isCBuffer () const {
@@ -449,6 +524,15 @@ void ResourceTypeInfo::print(raw_ostream &OS, const DataLayout &DL) const {
449524 }
450525}
451526
527+ GlobalVariable *ResourceBindingInfo::createSymbol (Module &M, StructType *Ty,
528+ StringRef Name) {
529+ assert (!Symbol && " Symbol has already been created" );
530+ Symbol = new GlobalVariable (M, Ty, /* isConstant=*/ true ,
531+ GlobalValue::ExternalLinkage,
532+ /* Initializer=*/ nullptr , Name);
533+ return Symbol;
534+ }
535+
452536MDTuple *ResourceBindingInfo::getAsMetadata (Module &M,
453537 dxil::ResourceTypeInfo &RTI) const {
454538 LLVMContext &Ctx = M.getContext ();
@@ -468,13 +552,9 @@ MDTuple *ResourceBindingInfo::getAsMetadata(Module &M,
468552 };
469553
470554 MDVals.push_back (getIntMD (Binding.RecordID ));
471-
472- // TODO: We need API to create a symbol of the appropriate type to emit here.
473- // See https://github.com/llvm/llvm-project/issues/116849
474- MDVals.push_back (
475- ValueAsMetadata::get (UndefValue::get (PointerType::getUnqual (Ctx))));
476- MDVals.push_back (MDString::get (Ctx, " " ));
477-
555+ assert (Symbol && " Cannot yet create useful resource metadata without symbol" );
556+ MDVals.push_back (ValueAsMetadata::get (Symbol));
557+ MDVals.push_back (MDString::get (Ctx, Symbol->getName ()));
478558 MDVals.push_back (getIntMD (Binding.Space ));
479559 MDVals.push_back (getIntMD (Binding.LowerBound ));
480560 MDVals.push_back (getIntMD (Binding.Size ));
@@ -573,6 +653,12 @@ ResourceBindingInfo::getAnnotateProps(Module &M,
573653
574654void ResourceBindingInfo::print (raw_ostream &OS, dxil::ResourceTypeInfo &RTI,
575655 const DataLayout &DL) const {
656+ if (Symbol) {
657+ OS << " Symbol: " ;
658+ Symbol->printAsOperand (OS);
659+ OS << " \n " ;
660+ }
661+
576662 OS << " Binding:\n "
577663 << " Record ID: " << Binding.RecordID << " \n "
578664 << " Space: " << Binding.Space << " \n "
0 commit comments