@@ -3553,10 +3553,10 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
35533553 TODO (converter.getCurrentLocation (), " OpenMPDeclareSimdConstruct" );
35543554}
35553555
3556- static void genOMP (lower::AbstractConverter &converter, lower::SymMap &symTable,
3557- semantics::SemanticsContext &semaCtx,
3558- lower::pft::Evaluation &eval ,
3559- const parser::OpenMPDeclareMapperConstruct &construct ) {
3556+ static void genOpenMPDeclareMapperImpl (
3557+ lower::AbstractConverter &converter, semantics::SemanticsContext &semaCtx,
3558+ const parser::OpenMPDeclareMapperConstruct &construct ,
3559+ const semantics::Symbol *mapperSymOpt = nullptr ) {
35603560 mlir::Location loc = converter.genLocation (construct.source );
35613561 fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
35623562 const parser::OmpArgumentList &args = construct.v .Arguments ();
@@ -3572,8 +3572,17 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
35723572 " Expected derived type" );
35733573
35743574 std::string mapperNameStr = mapperName;
3575- if (auto *sym = converter.getCurrentScope ().FindSymbol (mapperNameStr))
3575+ if (mapperSymOpt && mapperNameStr != " default" ) {
3576+ mapperNameStr = converter.mangleName (mapperNameStr, mapperSymOpt->owner ());
3577+ } else if (auto *sym =
3578+ converter.getCurrentScope ().FindSymbol (mapperNameStr)) {
35763579 mapperNameStr = converter.mangleName (mapperNameStr, sym->owner ());
3580+ }
3581+
3582+ // If the mapper op already exists (e.g., created by regular lowering or by
3583+ // materialization of imported mappers), do not recreate it.
3584+ if (converter.getModuleOp ().lookupSymbol (mapperNameStr))
3585+ return ;
35773586
35783587 // Save current insertion point before moving to the module scope to create
35793588 // the DeclareMapperOp
@@ -3596,6 +3605,13 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
35963605 mlir::omp::DeclareMapperInfoOp::create (firOpBuilder, loc, clauseOps.mapVars );
35973606}
35983607
3608+ static void genOMP (lower::AbstractConverter &converter, lower::SymMap &symTable,
3609+ semantics::SemanticsContext &semaCtx,
3610+ lower::pft::Evaluation &eval,
3611+ const parser::OpenMPDeclareMapperConstruct &construct) {
3612+ genOpenMPDeclareMapperImpl (converter, semaCtx, construct);
3613+ }
3614+
35993615static void
36003616genOMP (lower::AbstractConverter &converter, lower::SymMap &symTable,
36013617 semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
@@ -4231,3 +4247,36 @@ void Fortran::lower::genOpenMPRequires(mlir::Operation *mod,
42314247 offloadMod.setRequires (mlirFlags);
42324248 }
42334249}
4250+
4251+ // Walk scopes and materialize omp.declare_mapper ops for mapper declarations
4252+ // found in imported modules. If \p scope is null, start from the global scope.
4253+ void Fortran::lower::materializeOpenMPDeclareMappers (
4254+ Fortran::lower::AbstractConverter &converter,
4255+ semantics::SemanticsContext &semaCtx, const semantics::Scope *scope) {
4256+ const semantics::Scope &root = scope ? *scope : semaCtx.globalScope ();
4257+
4258+ // Recurse into child scopes first (modules, submodules, etc.).
4259+ for (const semantics::Scope &child : root.children ())
4260+ materializeOpenMPDeclareMappers (converter, semaCtx, &child);
4261+
4262+ // Only consider module scopes to avoid duplicating local constructs.
4263+ if (!root.IsModule ())
4264+ return ;
4265+
4266+ // Only materialize for modules coming from mod files to avoid duplicates.
4267+ if (!root.symbol () || !root.symbol ()->test (semantics::Symbol::Flag::ModFile))
4268+ return ;
4269+
4270+ // Scan symbols in this module scope for MapperDetails.
4271+ for (auto &it : root) {
4272+ const semantics::Symbol &sym = *it.second ;
4273+ if (auto *md = sym.detailsIf <semantics::MapperDetails>()) {
4274+ for (const auto *decl : md->GetDeclList ()) {
4275+ if (const auto *mapperDecl =
4276+ std::get_if<parser::OpenMPDeclareMapperConstruct>(&decl->u )) {
4277+ genOpenMPDeclareMapperImpl (converter, semaCtx, *mapperDecl, &sym);
4278+ }
4279+ }
4280+ }
4281+ }
4282+ }
0 commit comments