================ @@ -1841,14 +1867,112 @@ createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc, llvm::cast<mlir::omp::PointerLikeType>(retTy).getElementType()); mlir::omp::MapInfoOp op = builder.create<mlir::omp::MapInfoOp>( - loc, retTy, baseAddr, varType, varPtrPtr, members, bounds, + loc, retTy, baseAddr, varType, varPtrPtr, members, membersIndex, bounds, builder.getIntegerAttr(builder.getIntegerType(64, false), mapType), builder.getAttr<mlir::omp::VariableCaptureKindAttr>(mapCaptureType), - builder.getStringAttr(name)); + builder.getStringAttr(name), builder.getBoolAttr(partialMap)); return op; } +int findComponenetMemberPlacement( + const Fortran::semantics::Symbol *dTypeSym, + const Fortran::semantics::Symbol *componentSym) { + int placement = -1; + if (const auto *derived{ + dTypeSym->detailsIf<Fortran::semantics::DerivedTypeDetails>()}) { + for (auto t : derived->componentNames()) { + placement++; + if (t == componentSym->name()) + return placement; + } + } + return placement; +} + +static void +checkAndApplyDeclTargetMapFlags(Fortran::lower::AbstractConverter &converter, + llvm::omp::OpenMPOffloadMappingFlags &mapFlags, + Fortran::semantics::Symbol *symbol) { + mlir::Operation *op = + converter.getModuleOp().lookupSymbol(converter.mangleName(*symbol)); + if (op) + if (auto declareTargetOp = + llvm::dyn_cast<mlir::omp::DeclareTargetInterface>(op)) { + // only Link clauses have OMP_MAP_PTR_AND_OBJ applied, To clause + // functions fairly different. + if (declareTargetOp.getDeclareTargetCaptureClause() == + mlir::omp::DeclareTargetCaptureClause::link) + mapFlags |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_PTR_AND_OBJ; + } +} + +static void insertChildMapInfoIntoParent( + Fortran::lower::AbstractConverter &converter, + llvm::SmallVector<const Fortran::semantics::Symbol *> &memberParentSyms, + llvm::SmallVector<mlir::Value> &memberMaps, + llvm::SmallVector<mlir::Attribute> &memberPlacementIndices, + llvm::SmallVectorImpl<mlir::Value> &mapOperands, + llvm::SmallVectorImpl<mlir::Type> *mapSymTypes, + llvm::SmallVectorImpl<mlir::Location> *mapSymLocs, + llvm::SmallVectorImpl<const Fortran::semantics::Symbol *> *mapSymbols) { + // TODO: For multi-nested record types the top level parent is currently + // the containing parent for all member operations. + for (auto [idx, sym] : llvm::enumerate(memberParentSyms)) { + bool parentExists = false; + size_t parentIdx = 0; + for (size_t i = 0; i < mapSymbols->size(); ++i) { + if ((*mapSymbols)[i] == sym) { + parentExists = true; + parentIdx = i; + } + } + + if (parentExists) { + // found a parent, append. + if (auto mapOp = mlir::dyn_cast<mlir::omp::MapInfoOp>( + mapOperands[parentIdx].getDefiningOp())) { + mapOp.getMembersMutable().append(memberMaps[idx]); + llvm::SmallVector<mlir::Attribute> memberIndexTmp{ + mapOp.getMembersIndexAttr().begin(), + mapOp.getMembersIndexAttr().end()}; + memberIndexTmp.push_back(memberPlacementIndices[idx]); + mapOp.setMembersIndexAttr(mlir::ArrayAttr::get( + converter.getFirOpBuilder().getContext(), memberIndexTmp)); + } + } else { + // NOTE: We take the map type of the first child, this may not + // be the correct thing to do, however, we shall see. For the moment + // it allows this to work with enter and exit without causing MLIR + // verification issues. The more appropriate thing may be to take + // the "main" map type clause from the directive being used. + uint64_t mapType = 0; + if (auto mapOp = mlir::dyn_cast<mlir::omp::MapInfoOp>( ---------------- agozillon wrote:
It's assumed to only ever be a MapInfoOp, same as every other case where we cast to the MapInfoOp and then directly use its fields https://github.com/llvm/llvm-project/pull/81511 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits