aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
authorSteven Perron <stevenperron@google.com>2025-06-13 12:21:38 -0400
committerGitHub <noreply@github.com>2025-06-13 12:21:38 -0400
commitbd33eef7f1013bea24289a898f788a2efe9d8282 (patch)
tree52f5c0548cf1adc9001a8047af0e6affc9a9f28e /clang/lib
parentdec576514cb7106c59a5059ac6d52ebdf5de5275 (diff)
downloadllvm-bd33eef7f1013bea24289a898f788a2efe9d8282.zip
llvm-bd33eef7f1013bea24289a898f788a2efe9d8282.tar.gz
llvm-bd33eef7f1013bea24289a898f788a2efe9d8282.tar.bz2
[HLSL][SPIRV] Use resource names (#143412)
The SPIR-V backend does not have access to the original name of a resource in the source, so it tries to create a name. This leads to some problems with reflection. That is why start to pass the name of the resource from Clang to the SPIR-V backend. Fixes #138533
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CGHLSLBuiltins.cpp17
-rw-r--r--clang/lib/CodeGen/CGHLSLRuntime.cpp49
-rw-r--r--clang/lib/CodeGen/CGHLSLRuntime.h13
3 files changed, 20 insertions, 59 deletions
diff --git a/clang/lib/CodeGen/CGHLSLBuiltins.cpp b/clang/lib/CodeGen/CGHLSLBuiltins.cpp
index abebc20..ccf45c0 100644
--- a/clang/lib/CodeGen/CGHLSLBuiltins.cpp
+++ b/clang/lib/CodeGen/CGHLSLBuiltins.cpp
@@ -295,17 +295,16 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
Value *SpaceOp = EmitScalarExpr(E->getArg(2));
Value *RangeOp = EmitScalarExpr(E->getArg(3));
Value *IndexOp = EmitScalarExpr(E->getArg(4));
+ Value *Name = EmitScalarExpr(E->getArg(5));
// FIXME: NonUniformResourceIndex bit is not yet implemented
// (llvm/llvm-project#135452)
Value *NonUniform =
llvm::ConstantInt::get(llvm::Type::getInt1Ty(getLLVMContext()), false);
- auto [IntrinsicID, HasNameArg] =
+ llvm::Intrinsic::ID IntrinsicID =
CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic();
- SmallVector<Value *> Args{SpaceOp, RegisterOp, RangeOp, IndexOp,
- NonUniform};
- if (HasNameArg)
- Args.push_back(EmitScalarExpr(E->getArg(5)));
+ SmallVector<Value *> Args{SpaceOp, RegisterOp, RangeOp,
+ IndexOp, NonUniform, Name};
return Builder.CreateIntrinsic(HandleTy, IntrinsicID, Args);
}
case Builtin::BI__builtin_hlsl_resource_handlefromimplicitbinding: {
@@ -314,16 +313,16 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
Value *RangeOp = EmitScalarExpr(E->getArg(2));
Value *IndexOp = EmitScalarExpr(E->getArg(3));
Value *OrderID = EmitScalarExpr(E->getArg(4));
+ Value *Name = EmitScalarExpr(E->getArg(5));
// FIXME: NonUniformResourceIndex bit is not yet implemented
// (llvm/llvm-project#135452)
Value *NonUniform =
llvm::ConstantInt::get(llvm::Type::getInt1Ty(getLLVMContext()), false);
- auto [IntrinsicID, HasNameArg] =
+ llvm::Intrinsic::ID IntrinsicID =
CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic();
- SmallVector<Value *> Args{OrderID, SpaceOp, RangeOp, IndexOp, NonUniform};
- if (HasNameArg)
- Args.push_back(EmitScalarExpr(E->getArg(5)));
+ SmallVector<Value *> Args{OrderID, SpaceOp, RangeOp,
+ IndexOp, NonUniform, Name};
return Builder.CreateIntrinsic(HandleTy, IntrinsicID, Args);
}
case Builtin::BI__builtin_hlsl_all: {
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp
index 720dac8..977ff79 100644
--- a/clang/lib/CodeGen/CGHLSLRuntime.cpp
+++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp
@@ -237,35 +237,6 @@ static void fillPackoffsetLayout(const HLSLBufferDecl *BufDecl,
}
}
-std::pair<llvm::Intrinsic::ID, bool>
-CGHLSLRuntime::getCreateHandleFromBindingIntrinsic() {
- switch (getArch()) {
- case llvm::Triple::dxil:
- return std::pair(llvm::Intrinsic::dx_resource_handlefrombinding, true);
- case llvm::Triple::spirv:
- return std::pair(llvm::Intrinsic::spv_resource_handlefrombinding, false);
- default:
- llvm_unreachable("Intrinsic resource_handlefrombinding not supported by "
- "target architecture");
- }
-}
-
-std::pair<llvm::Intrinsic::ID, bool>
-CGHLSLRuntime::getCreateHandleFromImplicitBindingIntrinsic() {
- switch (getArch()) {
- case llvm::Triple::dxil:
- return std::pair(llvm::Intrinsic::dx_resource_handlefromimplicitbinding,
- true);
- case llvm::Triple::spirv:
- return std::pair(llvm::Intrinsic::spv_resource_handlefromimplicitbinding,
- false);
- default:
- llvm_unreachable(
- "Intrinsic resource_handlefromimplicitbinding not supported by "
- "target architecture");
- }
-}
-
// Codegen for HLSLBufferDecl
void CGHLSLRuntime::addBuffer(const HLSLBufferDecl *BufDecl) {
@@ -625,31 +596,27 @@ void CGHLSLRuntime::initializeBufferFromBinding(const HLSLBufferDecl *BufDecl,
llvm::ConstantInt::get(CGM.IntTy, RBA ? RBA->getSpaceNumber() : 0);
Value *Name = nullptr;
- auto [IntrinsicID, HasNameArg] =
+ llvm::Intrinsic::ID IntrinsicID =
RBA->hasRegisterSlot()
? CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic()
: CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic();
- if (HasNameArg) {
- std::string Str(BufDecl->getName());
- std::string GlobalName(Str + ".str");
- Name = CGM.GetAddrOfConstantCString(Str, GlobalName.c_str()).getPointer();
- }
+ std::string Str(BufDecl->getName());
+ std::string GlobalName(Str + ".str");
+ Name = CGM.GetAddrOfConstantCString(Str, GlobalName.c_str()).getPointer();
// buffer with explicit binding
if (RBA->hasRegisterSlot()) {
auto *RegSlot = llvm::ConstantInt::get(CGM.IntTy, RBA->getSlotNumber());
- SmallVector<Value *> Args{Space, RegSlot, RangeSize, Index, NonUniform};
- if (Name)
- Args.push_back(Name);
+ SmallVector<Value *> Args{Space, RegSlot, RangeSize,
+ Index, NonUniform, Name};
initializeBuffer(CGM, GV, IntrinsicID, Args);
} else {
// buffer with implicit binding
auto *OrderID =
llvm::ConstantInt::get(CGM.IntTy, RBA->getImplicitBindingOrderID());
- SmallVector<Value *> Args{OrderID, Space, RangeSize, Index, NonUniform};
- if (Name)
- Args.push_back(Name);
+ SmallVector<Value *> Args{OrderID, Space, RangeSize,
+ Index, NonUniform, Name};
initializeBuffer(CGM, GV, IntrinsicID, Args);
}
}
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h
index bb2b82f..89d2aff8 100644
--- a/clang/lib/CodeGen/CGHLSLRuntime.h
+++ b/clang/lib/CodeGen/CGHLSLRuntime.h
@@ -118,6 +118,10 @@ public:
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateResourceGetPointer,
resource_getpointer)
+ GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromBinding,
+ resource_handlefrombinding)
+ GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromImplicitBinding,
+ resource_handlefromimplicitbinding)
GENERATE_HLSL_INTRINSIC_FUNCTION(BufferUpdateCounter, resource_updatecounter)
GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync,
group_memory_barrier_with_group_sync)
@@ -126,15 +130,6 @@ public:
// End of reserved area for HLSL intrinsic getters.
//===----------------------------------------------------------------------===//
- // Returns ID of the intrinsic that initializes resource handle from binding
- // and a bool value indicating whether the last argument of the intrinsic is
- // the resource name (not all targets need that).
- std::pair<llvm::Intrinsic::ID, bool> getCreateHandleFromBindingIntrinsic();
-
- // Same as above but for implicit binding.
- std::pair<llvm::Intrinsic::ID, bool>
- getCreateHandleFromImplicitBindingIntrinsic();
-
protected:
CodeGenModule &CGM;