================ @@ -85,67 +135,227 @@ class OMPMapInfoFinalizationPass descriptor = alloca; } + return descriptor; + } + + /// Simple function that will generate a FIR operation accessing + /// the descriptors base address (BoxOffsetOp) and then generate a + /// MapInfoOp for it, the most important thing to note is that + /// we normally move the bounds from the descriptor map onto the + /// base address map. + mlir::omp::MapInfoOp getBaseAddrMap(mlir::Value descriptor, + mlir::OperandRange bounds, + int64_t mapType, + fir::FirOpBuilder &builder) { + mlir::Location loc = descriptor.getLoc(); mlir::Value baseAddrAddr = builder.create<fir::BoxOffsetOp>( loc, descriptor, fir::BoxFieldAttr::base_addr); // Member of the descriptor pointing at the allocated data - mlir::Value baseAddr = builder.create<mlir::omp::MapInfoOp>( + return builder.create<mlir::omp::MapInfoOp>( loc, baseAddrAddr.getType(), descriptor, mlir::TypeAttr::get(llvm::cast<mlir::omp::PointerLikeType>( fir::unwrapRefType(baseAddrAddr.getType())) .getElementType()), - baseAddrAddr, /*members=*/mlir::SmallVector<mlir::Value>{}, - /*member_index=*/mlir::DenseIntElementsAttr{}, op.getBounds(), - builder.getIntegerAttr(builder.getIntegerType(64, false), - op.getMapType().value()), + baseAddrAddr, mlir::SmallVector<mlir::Value>{}, + mlir::DenseIntElementsAttr{}, bounds, + builder.getIntegerAttr(builder.getIntegerType(64, false), mapType), builder.getAttr<mlir::omp::VariableCaptureKindAttr>( mlir::omp::VariableCaptureKind::ByRef), - /*name=*/builder.getStringAttr(""), - /*partial_map=*/builder.getBoolAttr(false)); + builder.getStringAttr("") /*name*/, + builder.getBoolAttr(false) /*partial_map*/); + } - // TODO: map the addendum segment of the descriptor, similarly to the - // above base address/data pointer member. + /// This function adjusts the member indices vector to include a new + /// base address member, we take the position of the descriptor in + /// the member indices list, which is the index data that the base + /// addresses index will be based off of, as the base address is + /// a member of the descriptor, we must also alter other members + /// indices in the list to account for this new addition. This + /// requires extending all members with -1's if the addition of + /// the new base address has increased the member vector past the + /// original size, as we must make sure all member indices are of + /// the same length (think rectangle matrix) due to DenseIntElementsAttr + /// requiring this. We also need to be aware that we are inserting + /// into the middle of a member index vector in some cases (i.e. + /// we could be accessing the member of a descriptor type with a + /// subsequent map, so we must be sure to adjust any of these cases + /// with the addition of the new base address index value). + void adjustMemberIndices( + llvm::SmallVector<llvm::SmallVector<int32_t>> &memberIndices, + size_t memberIndex) { + // Find if the descriptor member we are basing our new base address index + // off of has a -1 somewhere, indicating an empty index already exists (due + // to a larger sized member position elsewhere) which allows us to simplify + // later steps a little + auto baseAddrIndex = memberIndices[memberIndex]; ---------------- ergawy wrote:
Pronounce types when possible for readability. ```suggestion llvm::SmallVector<int32_t> baseAddrIndex = memberIndices[memberIndex]; ``` https://github.com/llvm/llvm-project/pull/96266 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits