================
@@ -627,11 +690,58 @@ class HLSLBufferCopyEmitter {
//
// See https://github.com/llvm/wg-hlsl/issues/351
emitElementCopy(SrcPtr.getBasePointer(), LayoutTy, DstPtr.getBasePointer(),
- DstPtr.getElementType());
+ DstPtr.getElementType(), EmitResFn);
return true;
}
};
+// Represents a list resources associated with a global struct whose name
+// starts with the specified prefix.
+// The order of HLSLAssociatedResourceDeclAttr attributes is identical to the
+// order of the depth-first traversal of the corresponding fields in the
struct.
+// The resources are always returned in that order, which is the same order
+// we need when a struct is copied element-by-element.
+class AssociatedResourcesList {
+ // Iterator pointers for the associated resource attributes that match the
+ // prefix. Begin = begin of the range of attributes that match the prefix End
+ // = end of the range of attributes that match the prefix Next = the current
+ // attribute in the iteration to be returned by getNextResource
+ specific_attr_iterator<HLSLAssociatedResourceDeclAttr> Begin, End, Next;
+
+public:
+ AssociatedResourcesList(const VarDecl *StructVD,
+ StringRef ResourceNamePrefix) {
+ auto I = StructVD->specific_attr_begin<HLSLAssociatedResourceDeclAttr>();
+ auto E = StructVD->specific_attr_end<HLSLAssociatedResourceDeclAttr>();
+
+ // Skip over associated resources that don't match the prefix.
+ while (I != E &&
+ !I->getResDecl()->getName().starts_with(ResourceNamePrefix))
----------------
hekota wrote:
When we need to find a declaration by a full resource name, we create an
`IdentifierInfo*` and match it against an existing declaration's
`IdentifierInfo*`. In this case we only match part of the name, for which
`IdentifierInfo*` does not exist, so direct string compare is probably the best
option.
https://github.com/llvm/llvm-project/pull/204232
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits