@@ -889,16 +889,17 @@ void ClauseProcessor::processMapObjects(
889
889
lower::StatementContext &stmtCtx, mlir::Location clauseLocation,
890
890
const omp::ObjectList &objects,
891
891
llvm::omp::OpenMPOffloadMappingFlags mapTypeBits,
892
- std::map<const semantics::Symbol *,
893
- llvm::SmallVector<OmpMapMemberIndicesData>> &parentMemberIndices,
892
+ std::map<Object, OmpMapParentAndMemberData> &parentMemberIndices,
894
893
llvm::SmallVectorImpl<mlir::Value> &mapVars,
895
894
llvm::SmallVectorImpl<const semantics::Symbol *> *mapSyms,
896
895
llvm::SmallVectorImpl<mlir::Location> *mapSymLocs,
897
896
llvm::SmallVectorImpl<mlir::Type> *mapSymTypes) const {
898
897
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
898
+
899
899
for (const omp::Object &object : objects) {
900
900
llvm::SmallVector<mlir::Value> bounds;
901
901
std::stringstream asFortran;
902
+ std::optional<omp::Object> parentObj;
902
903
903
904
lower::AddrAndBoundsInfo info =
904
905
lower::gatherDataOperandAddrAndBounds<mlir::omp::MapBoundsOp,
@@ -907,28 +908,47 @@ void ClauseProcessor::processMapObjects(
907
908
object.ref (), clauseLocation, asFortran, bounds,
908
909
treatIndexAsSection);
909
910
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
+
910
931
// Explicit map captures are captured ByRef by default,
911
932
// optimisation passes may alter this to ByCopy or other capture
912
933
// types to optimise
913
- mlir::Value baseOp = info.rawInput ;
914
934
auto location = mlir::NameLoc::get (
915
935
mlir::StringAttr::get (firOpBuilder.getContext (), asFortran.str ()),
916
936
baseOp.getLoc ());
917
937
mlir::omp::MapInfoOp mapOp = createMapInfoOp (
918
938
firOpBuilder, location, baseOp,
919
939
/* varPtrPtr=*/ mlir::Value{}, asFortran.str (), bounds,
920
- /* members=*/ {}, /* membersIndex=*/ mlir::DenseIntElementsAttr {},
940
+ /* members=*/ {}, /* membersIndex=*/ mlir::ArrayAttr {},
921
941
static_cast <
922
942
std::underlying_type_t <llvm::omp::OpenMPOffloadMappingFlags>>(
923
943
mapTypeBits),
924
944
mlir::omp::VariableCaptureKind::ByRef, baseOp.getType ());
925
945
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);
928
949
} else {
929
950
mapVars.push_back (mapOp);
930
- if (mapSyms)
931
- mapSyms->push_back (object.sym ());
951
+ mapSyms->push_back (object.sym ());
932
952
if (mapSymTypes)
933
953
mapSymTypes->push_back (baseOp.getType ());
934
954
if (mapSymLocs)
@@ -949,9 +969,7 @@ bool ClauseProcessor::processMap(
949
969
llvm::SmallVector<const semantics::Symbol *> localMapSyms;
950
970
llvm::SmallVectorImpl<const semantics::Symbol *> *ptrMapSyms =
951
971
mapSyms ? mapSyms : &localMapSyms;
952
- std::map<const semantics::Symbol *,
953
- llvm::SmallVector<OmpMapMemberIndicesData>>
954
- parentMemberIndices;
972
+ std::map<Object, OmpMapParentAndMemberData> parentMemberIndices;
955
973
956
974
bool clauseFound = findRepeatableClause<omp::clause::Map>(
957
975
[&](const omp::clause::Map &clause, const parser::CharBlock &source) {
@@ -997,23 +1015,22 @@ bool ClauseProcessor::processMap(
997
1015
mapTypeBits |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO |
998
1016
llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM;
999
1017
}
1018
+
1000
1019
processMapObjects (stmtCtx, clauseLocation,
1001
1020
std::get<omp::ObjectList>(clause.t ), mapTypeBits,
1002
1021
parentMemberIndices, result.mapVars , ptrMapSyms,
1003
1022
mapSymLocs, mapSymTypes);
1004
1023
});
1005
1024
1006
- insertChildMapInfoIntoParent (converter, parentMemberIndices, result. mapVars ,
1007
- *ptrMapSyms , mapSymTypes, mapSymLocs);
1008
-
1025
+ insertChildMapInfoIntoParent (converter, semaCtx, stmtCtx, parentMemberIndices ,
1026
+ result. mapVars , mapSymTypes, mapSymLocs,
1027
+ ptrMapSyms);
1009
1028
return clauseFound;
1010
1029
}
1011
1030
1012
1031
bool ClauseProcessor::processMotionClauses (lower::StatementContext &stmtCtx,
1013
1032
mlir::omp::MapClauseOps &result) {
1014
- std::map<const semantics::Symbol *,
1015
- llvm::SmallVector<OmpMapMemberIndicesData>>
1016
- parentMemberIndices;
1033
+ std::map<Object, OmpMapParentAndMemberData> parentMemberIndices;
1017
1034
llvm::SmallVector<const semantics::Symbol *> mapSymbols;
1018
1035
1019
1036
auto callbackFn = [&](const auto &clause, const parser::CharBlock &source) {
@@ -1034,9 +1051,9 @@ bool ClauseProcessor::processMotionClauses(lower::StatementContext &stmtCtx,
1034
1051
clauseFound =
1035
1052
findRepeatableClause<omp::clause::From>(callbackFn) || clauseFound;
1036
1053
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 );
1040
1057
return clauseFound;
1041
1058
}
1042
1059
@@ -1110,9 +1127,7 @@ bool ClauseProcessor::processUseDeviceAddr(
1110
1127
llvm::SmallVectorImpl<mlir::Type> &useDeviceTypes,
1111
1128
llvm::SmallVectorImpl<mlir::Location> &useDeviceLocs,
1112
1129
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;
1116
1131
bool clauseFound = findRepeatableClause<omp::clause::UseDeviceAddr>(
1117
1132
[&](const omp::clause::UseDeviceAddr &clause,
1118
1133
const parser::CharBlock &source) {
@@ -1125,9 +1140,9 @@ bool ClauseProcessor::processUseDeviceAddr(
1125
1140
&useDeviceSyms, &useDeviceLocs, &useDeviceTypes);
1126
1141
});
1127
1142
1128
- insertChildMapInfoIntoParent (converter, parentMemberIndices,
1129
- result.useDeviceAddrVars , useDeviceSyms ,
1130
- &useDeviceTypes , &useDeviceLocs );
1143
+ insertChildMapInfoIntoParent (converter, semaCtx, stmtCtx, parentMemberIndices,
1144
+ result.useDeviceAddrVars , &useDeviceTypes ,
1145
+ &useDeviceLocs , &useDeviceSyms );
1131
1146
return clauseFound;
1132
1147
}
1133
1148
@@ -1136,9 +1151,8 @@ bool ClauseProcessor::processUseDevicePtr(
1136
1151
llvm::SmallVectorImpl<mlir::Type> &useDeviceTypes,
1137
1152
llvm::SmallVectorImpl<mlir::Location> &useDeviceLocs,
1138
1153
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
+
1142
1156
bool clauseFound = findRepeatableClause<omp::clause::UseDevicePtr>(
1143
1157
[&](const omp::clause::UseDevicePtr &clause,
1144
1158
const parser::CharBlock &source) {
@@ -1151,9 +1165,9 @@ bool ClauseProcessor::processUseDevicePtr(
1151
1165
&useDeviceSyms, &useDeviceLocs, &useDeviceTypes);
1152
1166
});
1153
1167
1154
- insertChildMapInfoIntoParent (converter, parentMemberIndices,
1155
- result.useDevicePtrVars , useDeviceSyms ,
1156
- &useDeviceTypes , &useDeviceLocs );
1168
+ insertChildMapInfoIntoParent (converter, semaCtx, stmtCtx, parentMemberIndices,
1169
+ result.useDevicePtrVars , &useDeviceTypes ,
1170
+ &useDeviceLocs , &useDeviceSyms );
1157
1171
return clauseFound;
1158
1172
}
1159
1173
0 commit comments