================ @@ -2210,42 +2287,68 @@ static llvm::omp::OpenMPOffloadMappingFlags mapParentWithMembers( // Fortran pointers and allocatables, the mapping of the pointed to // data by the descriptor (which itself, is a structure containing // runtime information on the dynamically allocated data). - llvm::Value *lowAddr = builder.CreatePointerCast( - mapData.Pointers[mapDataIndex], builder.getPtrTy()); - llvm::Value *highAddr = builder.CreatePointerCast( - builder.CreateConstGEP1_32(mapData.BaseType[mapDataIndex], - mapData.Pointers[mapDataIndex], 1), - builder.getPtrTy()); + auto parentClause = + mlir::dyn_cast<mlir::omp::MapInfoOp>(mapData.MapClause[mapDataIndex]); + + llvm::Value *lowAddr, *highAddr; + if (!parentClause.getPartialMap()) { + lowAddr = builder.CreatePointerCast(mapData.Pointers[mapDataIndex], + builder.getPtrTy()); + highAddr = builder.CreatePointerCast( + builder.CreateConstGEP1_32(mapData.BaseType[mapDataIndex], + mapData.Pointers[mapDataIndex], 1), + builder.getPtrTy()); + combinedInfo.Pointers.emplace_back(mapData.Pointers[mapDataIndex]); + } else { + auto mapOp = + mlir::dyn_cast<mlir::omp::MapInfoOp>(mapData.MapClause[mapDataIndex]); + int firstMemberIdx = getMapDataMemberIdx( + mapData, getFirstOrLastMappedMemberPtr(mapOp, true)); + lowAddr = builder.CreatePointerCast(mapData.Pointers[firstMemberIdx], + builder.getPtrTy()); + int lastMemberIdx = getMapDataMemberIdx( + mapData, getFirstOrLastMappedMemberPtr(mapOp, false)); + highAddr = builder.CreatePointerCast( + builder.CreateGEP(mapData.BaseType[lastMemberIdx], + mapData.Pointers[lastMemberIdx], builder.getInt64(1)), + builder.getPtrTy()); + combinedInfo.Pointers.emplace_back(mapData.Pointers[firstMemberIdx]); + } + llvm::Value *size = builder.CreateIntCast( builder.CreatePtrDiff(builder.getInt8Ty(), highAddr, lowAddr), builder.getInt64Ty(), /*isSigned=*/false); combinedInfo.Sizes.push_back(size); - // This creates the initial MEMBER_OF mapping that consists of - // the parent/top level container (same as above effectively, except - // with a fixed initial compile time size and seperate maptype which - // indicates the true mape type (tofrom etc.) and that it is a part - // of a larger mapping and indicating the link between it and it's - // members that are also explicitly mapped). + // TODO: This will need expanded to include the whole host of logic for the + // map flags that Clang currently supports (e.g. it hsould take the map flag + // of the parent map flag, remove the OMP_MAP_TARGET_PARAM and do some further + // case specific flag modifications), for the moment it handles what we ---------------- skatrak wrote:
```suggestion // case-specific flag modifications). For the moment, it handles what we ``` https://github.com/llvm/llvm-project/pull/82852 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits