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