================ @@ -2612,7 +2612,54 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval, const parser::OpenMPDeclareMapperConstruct &declareMapperConstruct) { - TODO(converter.getCurrentLocation(), "OpenMPDeclareMapperConstruct"); + mlir::Location loc = converter.genLocation(declareMapperConstruct.source); + fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); + lower::StatementContext stmtCtx; + const auto &spec = + std::get<parser::OmpDeclareMapperSpecifier>(declareMapperConstruct.t); + const auto &mapperName{std::get<std::optional<parser::Name>>(spec.t)}; + const auto &varType{std::get<parser::TypeSpec>(spec.t)}; + const auto &varName{std::get<parser::Name>(spec.t)}; + assert(varType.declTypeSpec->category() == + semantics::DeclTypeSpec::Category::TypeDerived && + "Expected derived type"); + + std::string mapperNameStr; + if (mapperName.has_value()) { + mapperNameStr = mapperName->ToString(); + mapperNameStr = + converter.mangleName(mapperNameStr, mapperName->symbol->owner()); + } else { + mapperNameStr = + varType.declTypeSpec->derivedTypeSpec().name().ToString() + ".default"; + mapperNameStr = converter.mangleName( + mapperNameStr, *varType.declTypeSpec->derivedTypeSpec().GetScope()); + } + + // Save insert point just after the DeclMapperOp. + mlir::OpBuilder::InsertPoint insPt = firOpBuilder.saveInsertionPoint(); + + firOpBuilder.setInsertionPointToStart(converter.getModuleOp().getBody()); + auto mlirType = converter.genType(varType.declTypeSpec->derivedTypeSpec()); + auto declMapperOp = firOpBuilder.create<mlir::omp::DeclareMapperOp>( + loc, mapperNameStr, mlirType); + converter.getMLIRSymbolTable()->insert(declMapperOp); + auto ®ion = declMapperOp.getRegion(); + firOpBuilder.createBlock(®ion); + auto varVal = region.addArgument(firOpBuilder.getRefType(mlirType), loc); + converter.bindSymbol(*varName.symbol, varVal); + + // Populate the declareMapper region with the map information. + mlir::omp::DeclareMapperInfoOperands clauseOps; + const auto *clauseList{ + parser::Unwrap<parser::OmpClauseList>(declareMapperConstruct.t)}; + List<Clause> clauses = makeClauses(*clauseList, semaCtx); + ClauseProcessor cp(converter, semaCtx, clauses); + cp.processMap(loc, stmtCtx, clauseOps); + firOpBuilder.create<mlir::omp::DeclareMapperInfoOp>(loc, clauseOps.mapVars); + + // Restore the insert point to just after the DeclareMapperOp. + firOpBuilder.restoreInsertionPoint(insPt); ---------------- tblah wrote:
With my change to use the insertion point guard above ```suggestion ``` https://github.com/llvm/llvm-project/pull/117046 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits