@@ -4298,14 +4298,33 @@ mapParentWithMembers(LLVM::ModuleTranslation &moduleTranslation,
42984298 uint64_t mapDataIndex, TargetDirective targetDirective) {
42994299 assert (!ompBuilder.Config .isTargetDevice () &&
43004300 " function only supported for host device codegen" );
4301-
4302- // Map the first segment of our structure
43034301 const size_t parentIndex = combinedInfo.Types .size ();
4304- combinedInfo.Types .emplace_back (
4302+
4303+ // Map the first segment of the parent. If a user-defined mapper is attached,
4304+ // include the parent's to/from-style bits (and common modifiers) in this
4305+ // base entry so the mapper receives correct copy semantics via its 'type'
4306+ // parameter. Also keep TARGET_PARAM when required for kernel arguments.
4307+ llvm::omp::OpenMPOffloadMappingFlags baseFlag =
43054308 (targetDirective == TargetDirective::Target &&
43064309 !mapData.IsDeclareTarget [mapDataIndex])
43074310 ? llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TARGET_PARAM
4308- : llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_NONE);
4311+ : llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_NONE;
4312+
4313+ // Detect if this mapping uses a user-defined mapper.
4314+ bool hasUserMapper = mapData.Mappers [mapDataIndex] != nullptr ;
4315+ if (hasUserMapper) {
4316+ using mapFlags = llvm::omp::OpenMPOffloadMappingFlags;
4317+ // Preserve relevant map-type bits from the parent clause. These include
4318+ // the copy direction (TO/FROM), as well as commonly used modifiers that
4319+ // should be visible to the mapper for correct behaviour.
4320+ mapFlags parentFlags = mapData.Types [mapDataIndex];
4321+ mapFlags preserve = mapFlags::OMP_MAP_TO | mapFlags::OMP_MAP_FROM |
4322+ mapFlags::OMP_MAP_ALWAYS | mapFlags::OMP_MAP_CLOSE |
4323+ mapFlags::OMP_MAP_PRESENT | mapFlags::OMP_MAP_OMPX_HOLD;
4324+ baseFlag |= (parentFlags & preserve);
4325+ }
4326+
4327+ combinedInfo.Types .emplace_back (baseFlag);
43094328 combinedInfo.DevicePointers .emplace_back (
43104329 mapData.DevicePointers [mapDataIndex]);
43114330 combinedInfo.Mappers .emplace_back (mapData.Mappers [mapDataIndex]);
0 commit comments