2323#include " clang/AST/Type.h"
2424#include " clang/Basic/TargetOptions.h"
2525#include " llvm/ADT/SmallVector.h"
26+ #include " llvm/IR/Constants.h"
2627#include " llvm/IR/DerivedTypes.h"
2728#include " llvm/IR/GlobalVariable.h"
2829#include " llvm/IR/LLVMContext.h"
@@ -42,8 +43,8 @@ using namespace llvm;
4243using llvm::hlsl::CBufferRowSizeInBytes;
4344
4445static void initializeBufferFromBinding (CodeGenModule &CGM,
45- llvm::GlobalVariable *GV, unsigned Slot,
46- unsigned Space );
46+ llvm::GlobalVariable *GV,
47+ HLSLResourceBindingAttr *RBA );
4748
4849namespace {
4950
@@ -271,13 +272,10 @@ void CGHLSLRuntime::addBuffer(const HLSLBufferDecl *BufDecl) {
271272 emitBufferGlobalsAndMetadata (BufDecl, BufGV);
272273
273274 // Initialize cbuffer from binding (implicit or explicit)
274- const HLSLResourceBindingAttr *RBA =
275- BufDecl->getAttr <HLSLResourceBindingAttr>();
276- // FIXME: handle implicit binding if no binding attribute is found
277- // (llvm/llvm-project#110722)
278- if (RBA && RBA->hasRegisterSlot ())
279- initializeBufferFromBinding (CGM, BufGV, RBA->getSlotNumber (),
280- RBA->getSpaceNumber ());
275+ HLSLResourceBindingAttr *RBA = BufDecl->getAttr <HLSLResourceBindingAttr>();
276+ assert (RBA &&
277+ " cbuffer/tbuffer should always have resource binding attribute" );
278+ initializeBufferFromBinding (CGM, BufGV, RBA);
281279}
282280
283281llvm::TargetExtType *
@@ -560,19 +558,29 @@ static void initializeBuffer(CodeGenModule &CGM, llvm::GlobalVariable *GV,
560558}
561559
562560static void initializeBufferFromBinding (CodeGenModule &CGM,
563- llvm::GlobalVariable *GV, unsigned Slot,
564- unsigned Space ) {
561+ llvm::GlobalVariable *GV,
562+ HLSLResourceBindingAttr *RBA ) {
565563 llvm::Type *Int1Ty = llvm::Type::getInt1Ty (CGM.getLLVMContext ());
566- llvm::Value *Args[] = {
567- llvm::ConstantInt::get (CGM.IntTy , Space), /* reg_space */
568- llvm::ConstantInt::get (CGM.IntTy , Slot), /* lower_bound */
569- llvm::ConstantInt::get (CGM.IntTy , 1 ), /* range_size */
570- llvm::ConstantInt::get (CGM.IntTy , 0 ), /* index */
571- llvm::ConstantInt::get (Int1Ty, false ) /* non-uniform */
572- };
573- initializeBuffer (CGM, GV,
574- CGM.getHLSLRuntime ().getCreateHandleFromBindingIntrinsic (),
575- Args);
564+ auto *NonUniform = llvm::ConstantInt::get (Int1Ty, false );
565+ auto *Index = llvm::ConstantInt::get (CGM.IntTy , 0 );
566+ auto *RangeSize = llvm::ConstantInt::get (CGM.IntTy , 1 );
567+ auto *Space =
568+ llvm::ConstantInt::get (CGM.IntTy , RBA ? RBA->getSpaceNumber () : 0 );
569+
570+ if (RBA->hasRegisterSlot ()) {
571+ auto *RegSlot = llvm::ConstantInt::get (CGM.IntTy , RBA->getSlotNumber ());
572+ Intrinsic::ID Intr =
573+ CGM.getHLSLRuntime ().getCreateHandleFromBindingIntrinsic ();
574+ initializeBuffer (CGM, GV, Intr,
575+ {Space, RegSlot, RangeSize, Index, NonUniform});
576+ } else {
577+ auto *OrderID =
578+ llvm::ConstantInt::get (CGM.IntTy , RBA->getImplicitBindingOrderID ());
579+ Intrinsic::ID Intr =
580+ CGM.getHLSLRuntime ().getCreateHandleFromImplicitBindingIntrinsic ();
581+ initializeBuffer (CGM, GV, Intr,
582+ {OrderID, Space, RangeSize, Index, NonUniform});
583+ }
576584}
577585
578586llvm::Instruction *CGHLSLRuntime::getConvergenceToken (BasicBlock &BB) {
0 commit comments