================
@@ -8139,6 +8433,104 @@ class MappableExprsHandler {
}
}
+ /// Returns the address corresponding to \p PointerExpr.
+ static Address getAttachPtrAddr(const Expr *PointerExpr,
+ CodeGenFunction &CGF) {
+ assert(PointerExpr && "Cannot get addr from null attach-ptr expr");
+ Address AttachPtrAddr = Address::invalid();
+
+ if (auto *DRE = dyn_cast<DeclRefExpr>(PointerExpr)) {
+ // If the pointer is a variable, we can use its address directly.
+ AttachPtrAddr = CGF.EmitLValue(DRE).getAddress();
+ } else if (auto *OASE = dyn_cast<ArraySectionExpr>(PointerExpr)) {
+ AttachPtrAddr =
+ CGF.EmitArraySectionExpr(OASE, /*IsLowerBound=*/true).getAddress();
+ } else if (auto *ASE = dyn_cast<ArraySubscriptExpr>(PointerExpr)) {
+ AttachPtrAddr = CGF.EmitLValue(ASE).getAddress();
+ } else if (auto *ME = dyn_cast<MemberExpr>(PointerExpr)) {
+ AttachPtrAddr = CGF.EmitMemberExpr(ME).getAddress();
+ } else if (auto *UO = dyn_cast<UnaryOperator>(PointerExpr)) {
+ if (UO->getOpcode() == UO_Deref)
+ AttachPtrAddr = CGF.EmitLValue(UO).getAddress();
+ }
+ assert(AttachPtrAddr.isValid() &&
+ "Failed to get address for attach pointer expression");
+ return AttachPtrAddr;
+ }
+
+ /// Get the address of the attach pointer, and a load from it, to get the
+ /// pointee base address.
+ /// \return A pair containing AttachPtrAddr and AttachPteeBaseAddr. The pair
+ /// contains invalid addresses if \p AttachPtrExpr is null.
+ static std::pair<Address, Address>
+ getAttachPtrAddrAndPteeBaseAddr(const Expr *AttachPtrExpr,
+ CodeGenFunction &CGF) {
+
+ if (!AttachPtrExpr)
+ return {Address::invalid(), Address::invalid()};
+
+ Address AttachPtrAddr = getAttachPtrAddr(AttachPtrExpr, CGF);
+ assert(AttachPtrAddr.isValid() && "Invalid attach pointer addr");
+
+ QualType AttachPtrType =
+ OMPClauseMappableExprCommon::getComponentExprElementType(AttachPtrExpr)
+ .getCanonicalType();
+
+ Address AttachPteeBaseAddr = CGF.EmitLoadOfPointer(
+ AttachPtrAddr, AttachPtrType->castAs<PointerType>());
+ assert(AttachPteeBaseAddr.isValid() && "Invalid attach pointee base addr");
+
+ return {AttachPtrAddr, AttachPteeBaseAddr};
+ }
+
+ /// Returns whether an attach entry should be emitted for a map on
+ /// \p MapBaseDecl on the directive \p CurDir.
+ static bool
+ shouldEmitAttachEntry(const Expr *PointerExpr, const ValueDecl *MapBaseDecl,
+ CodeGenFunction &CGF,
+ llvm::PointerUnion<const OMPExecutableDirective *,
+ const OMPDeclareMapperDecl *>
+ CurDir) {
+ if (!PointerExpr)
+ return false;
+
+ // Pointer attachment is needed at map-entering time or for declare
+ // mappers.
+ if (!isa<const OMPDeclareMapperDecl *>(CurDir) &&
+ !isOpenMPTargetMapEnteringDirective(
+ cast<const OMPExecutableDirective *>(CurDir)->getDirectiveKind()))
+ return false;
+
+ return true;
----------------
alexey-bataev wrote:
```suggestion
return isa<const OMPDeclareMapperDecl *>(CurDir) ||
isOpenMPTargetMapEnteringDirective(
cast<const OMPExecutableDirective *>(CurDir)->getDirectiveKind()));
```
https://github.com/llvm/llvm-project/pull/155625
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits