|
39 | 39 | #include "mlir/Transforms/RegionUtils.h" |
40 | 40 | #include "llvm/ADT/STLExtras.h" |
41 | 41 | #include "llvm/Frontend/OpenMP/OMPConstants.h" |
| 42 | +#include <string> |
42 | 43 |
|
43 | 44 | using namespace Fortran::lower::omp; |
44 | 45 |
|
@@ -2701,7 +2702,39 @@ static void |
2701 | 2702 | genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, |
2702 | 2703 | semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval, |
2703 | 2704 | const parser::OpenMPDeclareMapperConstruct &declareMapperConstruct) { |
2704 | | - TODO(converter.getCurrentLocation(), "OpenMPDeclareMapperConstruct"); |
| 2705 | + fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); |
| 2706 | + lower::StatementContext stmtCtx; |
| 2707 | + const auto &spec = |
| 2708 | + std::get<parser::OmpDeclareMapperSpecifier>(declareMapperConstruct.t); |
| 2709 | + const auto &mapperName{std::get<std::optional<parser::Name>>(spec.t)}; |
| 2710 | + const auto &varType{std::get<parser::TypeSpec>(spec.t)}; |
| 2711 | + const auto &varName{std::get<parser::Name>(spec.t)}; |
| 2712 | + std::stringstream mapperNameStr; |
| 2713 | + if (mapperName.has_value()) { |
| 2714 | + mapperNameStr << mapperName->ToString(); |
| 2715 | + } else { |
| 2716 | + mapperNameStr << "default_" |
| 2717 | + << varType.declTypeSpec->derivedTypeSpec().name().ToString(); |
| 2718 | + } |
| 2719 | + |
| 2720 | + mlir::OpBuilder::InsertPoint insPt = firOpBuilder.saveInsertionPoint(); |
| 2721 | + firOpBuilder.setInsertionPointToStart(converter.getModuleOp().getBody()); |
| 2722 | + auto mlirType = converter.genType(varType.declTypeSpec->derivedTypeSpec()); |
| 2723 | + auto varVal = firOpBuilder.createTemporaryAlloc( |
| 2724 | + converter.getCurrentLocation(), mlirType, varName.ToString()); |
| 2725 | + symTable.addSymbol(*varName.symbol, varVal); |
| 2726 | + |
| 2727 | + mlir::omp::DeclareMapperOperands clauseOps; |
| 2728 | + const auto *clauseList{ |
| 2729 | + parser::Unwrap<parser::OmpClauseList>(declareMapperConstruct.t)}; |
| 2730 | + List<Clause> clauses = makeClauses(*clauseList, semaCtx); |
| 2731 | + ClauseProcessor cp(converter, semaCtx, clauses); |
| 2732 | + cp.processMap(converter.getCurrentLocation(), stmtCtx, clauseOps); |
| 2733 | + auto declMapperOp = firOpBuilder.create<mlir::omp::DeclareMapperOp>( |
| 2734 | + converter.getCurrentLocation(), mapperNameStr.str(), varVal, mlirType, |
| 2735 | + clauseOps.mapVars); |
| 2736 | + converter.getMLIRSymbolTable()->insert(declMapperOp.getOperation()); |
| 2737 | + firOpBuilder.restoreInsertionPoint(insPt); |
2705 | 2738 | } |
2706 | 2739 |
|
2707 | 2740 | static void |
|
0 commit comments