@@ -2635,10 +2635,13 @@ static llvm::omp::OpenMPOffloadMappingFlags mapParentWithMembers(
2635
2635
mlir::dyn_cast<mlir::omp::MapInfoOp>(mapData.MapClause [mapDataIndex]);
2636
2636
int firstMemberIdx = getMapDataMemberIdx (
2637
2637
mapData, getFirstOrLastMappedMemberPtr (mapOp, true ));
2638
- lowAddr = builder.CreatePointerCast (mapData.Pointers [firstMemberIdx],
2639
- builder.getPtrTy ());
2640
2638
int lastMemberIdx = getMapDataMemberIdx (
2641
2639
mapData, getFirstOrLastMappedMemberPtr (mapOp, false ));
2640
+
2641
+ // NOTE/TODO: Should perhaps use OriginalValue here instead of Pointers to
2642
+ // avoid offset or any manipulations interfering with the calculation.
2643
+ lowAddr = builder.CreatePointerCast (mapData.Pointers [firstMemberIdx],
2644
+ builder.getPtrTy ());
2642
2645
highAddr = builder.CreatePointerCast (
2643
2646
builder.CreateGEP (mapData.BaseType [lastMemberIdx],
2644
2647
mapData.Pointers [lastMemberIdx], builder.getInt64 (1 )),
@@ -2652,17 +2655,8 @@ static llvm::omp::OpenMPOffloadMappingFlags mapParentWithMembers(
2652
2655
/* isSigned=*/ false );
2653
2656
combinedInfo.Sizes .push_back (size);
2654
2657
2655
- // TODO: This will need to be expanded to include the whole host of logic for
2656
- // the map flags that Clang currently supports (e.g. it should take the map
2657
- // flag of the parent map flag, remove the OMP_MAP_TARGET_PARAM and do some
2658
- // further case specific flag modifications). For the moment, it handles what
2659
- // we support as expected.
2660
- llvm::omp::OpenMPOffloadMappingFlags mapFlag =
2661
- llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
2662
-
2663
2658
llvm::omp::OpenMPOffloadMappingFlags memberOfFlag =
2664
2659
ompBuilder.getMemberOfFlag (combinedInfo.BasePointers .size () - 1 );
2665
- ompBuilder.setCorrectMemberOfFlag (mapFlag, memberOfFlag);
2666
2660
2667
2661
// This creates the initial MEMBER_OF mapping that consists of
2668
2662
// the parent/top level container (same as above effectively, except
@@ -2671,6 +2665,12 @@ static llvm::omp::OpenMPOffloadMappingFlags mapParentWithMembers(
2671
2665
// only relevant if the structure in its totality is being mapped,
2672
2666
// otherwise the above suffices.
2673
2667
if (!parentClause.getPartialMap ()) {
2668
+ // TODO: This will need to be expanded to include the whole host of logic
2669
+ // for the map flags that Clang currently supports (e.g. it should do some
2670
+ // further case specific flag modifications). For the moment, it handles
2671
+ // what we support as expected.
2672
+ llvm::omp::OpenMPOffloadMappingFlags mapFlag = mapData.Types [mapDataIndex];
2673
+ ompBuilder.setCorrectMemberOfFlag (mapFlag, memberOfFlag);
2674
2674
combinedInfo.Types .emplace_back (mapFlag);
2675
2675
combinedInfo.DevicePointers .emplace_back (
2676
2676
mapData.DevicePointers [mapDataIndex]);
@@ -2721,6 +2721,24 @@ static void processMapMembersWithParent(
2721
2721
2722
2722
assert (memberDataIdx >= 0 && " could not find mapped member of structure" );
2723
2723
2724
+ if (checkIfPointerMap (memberClause)) {
2725
+ auto mapFlag = llvm::omp::OpenMPOffloadMappingFlags (
2726
+ memberClause.getMapType ().value ());
2727
+ mapFlag &= ~llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TARGET_PARAM;
2728
+ mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_MEMBER_OF;
2729
+ ompBuilder.setCorrectMemberOfFlag (mapFlag, memberOfFlag);
2730
+ combinedInfo.Types .emplace_back (mapFlag);
2731
+ combinedInfo.DevicePointers .emplace_back (
2732
+ llvm::OpenMPIRBuilder::DeviceInfoTy::None);
2733
+ combinedInfo.Names .emplace_back (
2734
+ LLVM::createMappingInformation (memberClause.getLoc (), ompBuilder));
2735
+ combinedInfo.BasePointers .emplace_back (
2736
+ mapData.BasePointers [mapDataIndex]);
2737
+ combinedInfo.Pointers .emplace_back (mapData.BasePointers [memberDataIdx]);
2738
+ combinedInfo.Sizes .emplace_back (builder.getInt64 (
2739
+ moduleTranslation.getLLVMModule ()->getDataLayout ().getPointerSize ()));
2740
+ }
2741
+
2724
2742
// Same MemberOfFlag to indicate its link with parent and other members
2725
2743
// of.
2726
2744
auto mapFlag =
@@ -2736,7 +2754,14 @@ static void processMapMembersWithParent(
2736
2754
llvm::OpenMPIRBuilder::DeviceInfoTy::None);
2737
2755
combinedInfo.Names .emplace_back (
2738
2756
LLVM::createMappingInformation (memberClause.getLoc (), ompBuilder));
2739
- combinedInfo.BasePointers .emplace_back (mapData.BasePointers [mapDataIndex]);
2757
+
2758
+ if (checkIfPointerMap (memberClause))
2759
+ combinedInfo.BasePointers .emplace_back (
2760
+ mapData.BasePointers [memberDataIdx]);
2761
+ else
2762
+ combinedInfo.BasePointers .emplace_back (
2763
+ mapData.BasePointers [mapDataIndex]);
2764
+
2740
2765
combinedInfo.Pointers .emplace_back (mapData.Pointers [memberDataIdx]);
2741
2766
combinedInfo.Sizes .emplace_back (mapData.Sizes [memberDataIdx]);
2742
2767
}
0 commit comments