@@ -4298,14 +4298,33 @@ mapParentWithMembers(LLVM::ModuleTranslation &moduleTranslation,
4298
4298
uint64_t mapDataIndex, TargetDirective targetDirective) {
4299
4299
assert (!ompBuilder.Config .isTargetDevice () &&
4300
4300
" function only supported for host device codegen" );
4301
-
4302
- // Map the first segment of our structure
4303
4301
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 =
4305
4308
(targetDirective == TargetDirective::Target &&
4306
4309
!mapData.IsDeclareTarget [mapDataIndex])
4307
4310
? 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);
4309
4328
combinedInfo.DevicePointers .emplace_back (
4310
4329
mapData.DevicePointers [mapDataIndex]);
4311
4330
combinedInfo.Mappers .emplace_back (mapData.Mappers [mapDataIndex]);
0 commit comments