|
| 1 | +//===-- lib/Utisl/OpenMP.cpp ------------------------------------*- C++ -*-===// |
| 2 | +// |
| 3 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | +// See https://llvm.org/LICENSE.txt for license information. |
| 5 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | +// |
| 7 | +//===----------------------------------------------------------------------===// |
| 8 | + |
| 9 | +#include "flang/Utils/OpenMP.h" |
| 10 | + |
| 11 | +#include "flang/Optimizer/Dialect/FIROps.h" |
| 12 | +#include "flang/Optimizer/Dialect/FIRType.h" |
| 13 | + |
| 14 | +#include "mlir/Dialect/OpenMP/OpenMPDialect.h" |
| 15 | + |
| 16 | +namespace Fortran::utils::openmp { |
| 17 | +mlir::omp::MapInfoOp createMapInfoOp(mlir::OpBuilder &builder, |
| 18 | + mlir::Location loc, mlir::Value baseAddr, mlir::Value varPtrPtr, |
| 19 | + llvm::StringRef name, llvm::ArrayRef<mlir::Value> bounds, |
| 20 | + llvm::ArrayRef<mlir::Value> members, mlir::ArrayAttr membersIndex, |
| 21 | + uint64_t mapType, mlir::omp::VariableCaptureKind mapCaptureType, |
| 22 | + mlir::Type retTy, bool partialMap, mlir::FlatSymbolRefAttr mapperId) { |
| 23 | + |
| 24 | + if (auto boxTy = llvm::dyn_cast<fir::BaseBoxType>(baseAddr.getType())) { |
| 25 | + baseAddr = fir::BoxAddrOp::create(builder, loc, baseAddr); |
| 26 | + retTy = baseAddr.getType(); |
| 27 | + } |
| 28 | + |
| 29 | + mlir::TypeAttr varType = mlir::TypeAttr::get( |
| 30 | + llvm::cast<mlir::omp::PointerLikeType>(retTy).getElementType()); |
| 31 | + |
| 32 | + // For types with unknown extents such as <2x?xi32> we discard the incomplete |
| 33 | + // type info and only retain the base type. The correct dimensions are later |
| 34 | + // recovered through the bounds info. |
| 35 | + if (auto seqType = llvm::dyn_cast<fir::SequenceType>(varType.getValue())) |
| 36 | + if (seqType.hasDynamicExtents()) |
| 37 | + varType = mlir::TypeAttr::get(seqType.getEleTy()); |
| 38 | + |
| 39 | + mlir::omp::MapInfoOp op = |
| 40 | + mlir::omp::MapInfoOp::create(builder, loc, retTy, baseAddr, varType, |
| 41 | + builder.getIntegerAttr(builder.getIntegerType(64, false), mapType), |
| 42 | + builder.getAttr<mlir::omp::VariableCaptureKindAttr>(mapCaptureType), |
| 43 | + varPtrPtr, members, membersIndex, bounds, mapperId, |
| 44 | + builder.getStringAttr(name), builder.getBoolAttr(partialMap)); |
| 45 | + return op; |
| 46 | +} |
| 47 | +} // namespace Fortran::utils::openmp |
0 commit comments