================
@@ -1459,27 +1458,63 @@ bool CGHLSLRuntime::emitResourceArrayCopy(LValue &LHS,
Expr *RHSExpr,
// Find the individual resource type.
ASTContext &AST = ArrayDecl->getASTContext();
- QualType ResTy = AST.getBaseElementType(ResultTy);
- const auto *ResArrayTy = cast<ConstantArrayType>(ResultTy.getTypePtr());
-
- // Use the provided LHS for the result.
- AggValueSlot ValueSlot = AggValueSlot::forAddr(
- LHS.getAddress(), Qualifiers(), AggValueSlot::IsDestructed_t(true),
- AggValueSlot::DoesNotNeedGCBarriers, AggValueSlot::IsAliased_t(false),
- AggValueSlot::DoesNotOverlap);
+ QualType ResTy = AST.getBaseElementType(ArrayDecl->getType());
+ const auto *ResArrayTy =
+ cast<ConstantArrayType>(ArrayDecl->getType().getTypePtr());
// Create Value for index and total array size (= range size).
int Size = getTotalArraySize(AST, ResArrayTy);
llvm::Value *Zero = llvm::ConstantInt::get(CGM.IntTy, 0);
llvm::Value *Range = llvm::ConstantInt::get(CGM.IntTy, Size);
- // Initialize individual resources in the array into LHS.
- std::optional<llvm::Value *> EndIndex = initializeLocalResourceArray(
- CGF, ResTy->getAsCXXRecordDecl(), ResArrayTy, ValueSlot, Range, Zero,
- ArrayDecl->getName(), Binding, {Zero}, RHSExpr->getExprLoc());
+ // Initialize individual resources in the array into DestSlot.
+ std::optional<llvm::Value *> EndIndex = initializeResourceArrayFromGlobal(
+ CGF, ResTy->getAsCXXRecordDecl(), ResArrayTy, DestSlot, Range, Zero,
+ ArrayDecl->getName(), Binding, {Zero}, Loc);
return EndIndex.has_value();
}
+// If the expression is a global resource array, initialize all of its
resources
+// into Dest. Returns false if no initialization has been performed and the
+// array copy should be handled by the default codegen.
+bool CGHLSLRuntime::emitGlobalResourceArray(CodeGenFunction &CGF, const Expr
*E,
+ AggValueSlot &DestSlot) {
+ assert(E->getType()->isHLSLResourceRecordArray() &&
+ "expected resource array");
+
+ // Find the array declaration for the expression. Fallback to the default
+ // handling if it's not a global resource array.
+ const VarDecl *ArrayDecl =
+ dyn_cast_or_null<VarDecl>(getArrayDecl(CGF.CGM.getContext(), E));
+ if (!ArrayDecl || !ArrayDecl->hasGlobalStorage() ||
+ ArrayDecl->getStorageClass() == SC_Static)
+ return false;
+
+ return initializeGlobalResourceArray(CGF, ArrayDecl, E->getExprLoc(),
+ DestSlot);
+}
+
+// If the expression is a global resource array, create a temporary and
+// initialize all of its resources, and return is as an LValue. Returns false
if
+// no initialization has been performed and the handling should follow the
+// default path.
+std::optional<LValue> CGHLSLRuntime::emitGlobalResourceArrayAsLValue(
----------------
Icohedron wrote:
```suggestion
// If the expression is a global resource array, create a temporary and
// initialize all of its resources, and return it as an LValue. Returns nullopt
if
// no initialization has been performed and the handling should follow the
// default path.
std::optional<LValue> CGHLSLRuntime::emitGlobalResourceArrayAsLValue(
```
https://github.com/llvm/llvm-project/pull/198891
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits