[clang] Implement resource binding type prefix mismatch diagnostic infrastructure (PR #97103)
Helena Kotas via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 22 14:12:34 PDT 2024
================
@@ -459,7 +467,412 @@ void SemaHLSL::handleResourceClassAttr(Decl *D, const ParsedAttr &AL) {
D->addAttr(HLSLResourceClassAttr::Create(getASTContext(), RC, ArgLoc));
}
-void SemaHLSL::handleResourceBindingAttr(Decl *D, const ParsedAttr &AL) {
+struct RegisterBindingFlags {
+ bool Resource = false;
+ bool UDT = false;
+ bool Other = false;
+ bool Basic = false;
+
+ bool SRV = false;
+ bool UAV = false;
+ bool CBV = false;
+ bool Sampler = false;
+
+ bool ContainsNumeric = false;
+ bool DefaultGlobals = false;
+};
+
+static bool isDeclaredWithinCOrTBuffer(const Decl *TheDecl) {
+ if (!TheDecl)
+ return false;
+
+ // Traverse up the parent contexts
+ const DeclContext *context = TheDecl->getDeclContext();
+ if (isa<HLSLBufferDecl>(context)) {
+ return true;
+ }
+
+ return false;
+}
+
+// get the record decl from a var decl that we expect
+// represents a resource
+static CXXRecordDecl *getRecordDeclFromVarDecl(VarDecl *VD) {
+ const Type *Ty = VD->getType()->getPointeeOrArrayElementType();
+ assert(Ty && "Resource must have an element type.");
+
+ if (const auto *TheBuiltinTy = dyn_cast<BuiltinType>(Ty))
+ return nullptr;
+
+ CXXRecordDecl *TheRecordDecl = Ty->getAsCXXRecordDecl();
+ assert(TheRecordDecl && "Resource should have a resource type declaration.");
+ return TheRecordDecl;
+}
+
+static void setResourceClassFlagsFromDeclResourceClass(
+ RegisterBindingFlags &Flags, llvm::hlsl::ResourceClass DeclResourceClass) {
+ switch (DeclResourceClass) {
+ case llvm::hlsl::ResourceClass::SRV:
+ Flags.SRV = true;
+ break;
+ case llvm::hlsl::ResourceClass::UAV:
+ Flags.UAV = true;
+ break;
+ case llvm::hlsl::ResourceClass::CBuffer:
+ Flags.CBV = true;
+ break;
+ case llvm::hlsl::ResourceClass::Sampler:
+ Flags.Sampler = true;
+ break;
+ }
+}
+
+template <typename T>
+static const T *
+getSpecifiedHLSLAttrFromVarDeclOrRecordDecl(VarDecl *VD,
+ RecordDecl *TheRecordDecl) {
----------------
hekota wrote:
I agree with @damyanp. This function seems to always be called with one of the arguments null. Why not have `getAttributeFromVarDecl` and `getAttributeFromRecordDecl`, and the first one would call the other in the `VarDecl` case?
Additionally, `getAttributeFromRecordDecl` could also detect the attibute on the record decl itself, avoiding the separate check on line 598 (with comment `// otherwise, check if the member of the UDT itself has a resource class attr`).
Also, this seems to find just the first instance of the attribute. Is that ok? What if there are more and with conflicting resource classes? Have you considered passing in the `RegisterBindingFlags` by reference and let the function fill in the resource class and other info, instead of extracting a single attribute?
https://github.com/llvm/llvm-project/pull/97103
More information about the cfe-commits
mailing list