@@ -889,16 +889,17 @@ void ClauseProcessor::processMapObjects(
889889 lower::StatementContext &stmtCtx, mlir::Location clauseLocation,
890890 const omp::ObjectList &objects,
891891 llvm::omp::OpenMPOffloadMappingFlags mapTypeBits,
892- std::map<const semantics::Symbol *,
893- llvm::SmallVector<OmpMapMemberIndicesData>> &parentMemberIndices,
892+ std::map<Object, OmpMapParentAndMemberData> &parentMemberIndices,
894893 llvm::SmallVectorImpl<mlir::Value> &mapVars,
895894 llvm::SmallVectorImpl<const semantics::Symbol *> *mapSyms,
896895 llvm::SmallVectorImpl<mlir::Location> *mapSymLocs,
897896 llvm::SmallVectorImpl<mlir::Type> *mapSymTypes) const {
898897 fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
898+
899899 for (const omp::Object &object : objects) {
900900 llvm::SmallVector<mlir::Value> bounds;
901901 std::stringstream asFortran;
902+ std::optional<omp::Object> parentObj;
902903
903904 lower::AddrAndBoundsInfo info =
904905 lower::gatherDataOperandAddrAndBounds<mlir::omp::MapBoundsOp,
@@ -907,28 +908,47 @@ void ClauseProcessor::processMapObjects(
907908 object.ref (), clauseLocation, asFortran, bounds,
908909 treatIndexAsSection);
909910
911+ mlir::Value baseOp = info.rawInput ;
912+ if (object.sym ()->owner ().IsDerivedType ()) {
913+ omp::ObjectList objectList = gatherObjects (object, semaCtx);
914+ assert (!objectList.empty () &&
915+ " could not find parent objects of derived type member" );
916+ parentObj = objectList[0 ];
917+ auto insert = parentMemberIndices.emplace (parentObj.value (),
918+ OmpMapParentAndMemberData{});
919+ insert.first ->second .parentObjList .push_back (parentObj.value ());
920+
921+ if (isMemberOrParentAllocatableOrPointer (object, semaCtx)) {
922+ llvm::SmallVector<int64_t > indices;
923+ generateMemberPlacementIndices (object, indices, semaCtx);
924+ baseOp = createParentSymAndGenIntermediateMaps (
925+ clauseLocation, converter, semaCtx, stmtCtx, objectList, indices,
926+ parentMemberIndices[parentObj.value ()], asFortran.str (),
927+ mapTypeBits);
928+ }
929+ }
930+
910931 // Explicit map captures are captured ByRef by default,
911932 // optimisation passes may alter this to ByCopy or other capture
912933 // types to optimise
913- mlir::Value baseOp = info.rawInput ;
914934 auto location = mlir::NameLoc::get (
915935 mlir::StringAttr::get (firOpBuilder.getContext (), asFortran.str ()),
916936 baseOp.getLoc ());
917937 mlir::omp::MapInfoOp mapOp = createMapInfoOp (
918938 firOpBuilder, location, baseOp,
919939 /* varPtrPtr=*/ mlir::Value{}, asFortran.str (), bounds,
920- /* members=*/ {}, /* membersIndex=*/ mlir::DenseIntElementsAttr {},
940+ /* members=*/ {}, /* membersIndex=*/ mlir::ArrayAttr {},
921941 static_cast <
922942 std::underlying_type_t <llvm::omp::OpenMPOffloadMappingFlags>>(
923943 mapTypeBits),
924944 mlir::omp::VariableCaptureKind::ByRef, baseOp.getType ());
925945
926- if (object.sym ()->owner ().IsDerivedType ()) {
927- addChildIndexAndMapToParent (object, parentMemberIndices, mapOp, semaCtx);
946+ if (parentObj.has_value ()) {
947+ addChildIndexAndMapToParent (
948+ object, parentMemberIndices[parentObj.value ()], mapOp, semaCtx);
928949 } else {
929950 mapVars.push_back (mapOp);
930- if (mapSyms)
931- mapSyms->push_back (object.sym ());
951+ mapSyms->push_back (object.sym ());
932952 if (mapSymTypes)
933953 mapSymTypes->push_back (baseOp.getType ());
934954 if (mapSymLocs)
@@ -949,9 +969,7 @@ bool ClauseProcessor::processMap(
949969 llvm::SmallVector<const semantics::Symbol *> localMapSyms;
950970 llvm::SmallVectorImpl<const semantics::Symbol *> *ptrMapSyms =
951971 mapSyms ? mapSyms : &localMapSyms;
952- std::map<const semantics::Symbol *,
953- llvm::SmallVector<OmpMapMemberIndicesData>>
954- parentMemberIndices;
972+ std::map<Object, OmpMapParentAndMemberData> parentMemberIndices;
955973
956974 bool clauseFound = findRepeatableClause<omp::clause::Map>(
957975 [&](const omp::clause::Map &clause, const parser::CharBlock &source) {
@@ -997,23 +1015,22 @@ bool ClauseProcessor::processMap(
9971015 mapTypeBits |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO |
9981016 llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM;
9991017 }
1018+
10001019 processMapObjects (stmtCtx, clauseLocation,
10011020 std::get<omp::ObjectList>(clause.t ), mapTypeBits,
10021021 parentMemberIndices, result.mapVars , ptrMapSyms,
10031022 mapSymLocs, mapSymTypes);
10041023 });
10051024
1006- insertChildMapInfoIntoParent (converter, parentMemberIndices, result. mapVars ,
1007- *ptrMapSyms , mapSymTypes, mapSymLocs);
1008-
1025+ insertChildMapInfoIntoParent (converter, semaCtx, stmtCtx, parentMemberIndices ,
1026+ result. mapVars , mapSymTypes, mapSymLocs,
1027+ ptrMapSyms);
10091028 return clauseFound;
10101029}
10111030
10121031bool ClauseProcessor::processMotionClauses (lower::StatementContext &stmtCtx,
10131032 mlir::omp::MapClauseOps &result) {
1014- std::map<const semantics::Symbol *,
1015- llvm::SmallVector<OmpMapMemberIndicesData>>
1016- parentMemberIndices;
1033+ std::map<Object, OmpMapParentAndMemberData> parentMemberIndices;
10171034 llvm::SmallVector<const semantics::Symbol *> mapSymbols;
10181035
10191036 auto callbackFn = [&](const auto &clause, const parser::CharBlock &source) {
@@ -1034,9 +1051,9 @@ bool ClauseProcessor::processMotionClauses(lower::StatementContext &stmtCtx,
10341051 clauseFound =
10351052 findRepeatableClause<omp::clause::From>(callbackFn) || clauseFound;
10361053
1037- insertChildMapInfoIntoParent (converter, parentMemberIndices, result. mapVars ,
1038- mapSymbols ,
1039- /* mapSymTypes=*/ nullptr , /* mapSymLocs=*/ nullptr );
1054+ insertChildMapInfoIntoParent (
1055+ converter, semaCtx, stmtCtx, parentMemberIndices, result. mapVars ,
1056+ /* mapSymTypes=*/ nullptr , /* mapSymLocs=*/ nullptr , &mapSymbols );
10401057 return clauseFound;
10411058}
10421059
@@ -1110,9 +1127,7 @@ bool ClauseProcessor::processUseDeviceAddr(
11101127 llvm::SmallVectorImpl<mlir::Type> &useDeviceTypes,
11111128 llvm::SmallVectorImpl<mlir::Location> &useDeviceLocs,
11121129 llvm::SmallVectorImpl<const semantics::Symbol *> &useDeviceSyms) const {
1113- std::map<const semantics::Symbol *,
1114- llvm::SmallVector<OmpMapMemberIndicesData>>
1115- parentMemberIndices;
1130+ std::map<Object, OmpMapParentAndMemberData> parentMemberIndices;
11161131 bool clauseFound = findRepeatableClause<omp::clause::UseDeviceAddr>(
11171132 [&](const omp::clause::UseDeviceAddr &clause,
11181133 const parser::CharBlock &source) {
@@ -1125,9 +1140,9 @@ bool ClauseProcessor::processUseDeviceAddr(
11251140 &useDeviceSyms, &useDeviceLocs, &useDeviceTypes);
11261141 });
11271142
1128- insertChildMapInfoIntoParent (converter, parentMemberIndices,
1129- result.useDeviceAddrVars , useDeviceSyms ,
1130- &useDeviceTypes , &useDeviceLocs );
1143+ insertChildMapInfoIntoParent (converter, semaCtx, stmtCtx, parentMemberIndices,
1144+ result.useDeviceAddrVars , &useDeviceTypes ,
1145+ &useDeviceLocs , &useDeviceSyms );
11311146 return clauseFound;
11321147}
11331148
@@ -1136,9 +1151,8 @@ bool ClauseProcessor::processUseDevicePtr(
11361151 llvm::SmallVectorImpl<mlir::Type> &useDeviceTypes,
11371152 llvm::SmallVectorImpl<mlir::Location> &useDeviceLocs,
11381153 llvm::SmallVectorImpl<const semantics::Symbol *> &useDeviceSyms) const {
1139- std::map<const semantics::Symbol *,
1140- llvm::SmallVector<OmpMapMemberIndicesData>>
1141- parentMemberIndices;
1154+ std::map<Object, OmpMapParentAndMemberData> parentMemberIndices;
1155+
11421156 bool clauseFound = findRepeatableClause<omp::clause::UseDevicePtr>(
11431157 [&](const omp::clause::UseDevicePtr &clause,
11441158 const parser::CharBlock &source) {
@@ -1151,9 +1165,9 @@ bool ClauseProcessor::processUseDevicePtr(
11511165 &useDeviceSyms, &useDeviceLocs, &useDeviceTypes);
11521166 });
11531167
1154- insertChildMapInfoIntoParent (converter, parentMemberIndices,
1155- result.useDevicePtrVars , useDeviceSyms ,
1156- &useDeviceTypes , &useDeviceLocs );
1168+ insertChildMapInfoIntoParent (converter, semaCtx, stmtCtx, parentMemberIndices,
1169+ result.useDevicePtrVars , &useDeviceTypes ,
1170+ &useDeviceLocs , &useDeviceSyms );
11571171 return clauseFound;
11581172}
11591173
0 commit comments