@@ -2391,14 +2391,17 @@ genSingleOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
23912391 queue, item, clauseOps);
23922392}
23932393
2394- static mlir::FlatSymbolRefAttr
2395- genImplicitDefaultDeclareMapper (lower::AbstractConverter &converter,
2396- mlir::Location loc, fir::RecordType recordType,
2397- llvm::StringRef mapperNameStr) {
2394+ static mlir::FlatSymbolRefAttr getOrGenImplicitDefaultDeclareMapper (
2395+ lower::AbstractConverter &converter, mlir::Location loc,
2396+ fir::RecordType recordType, llvm::StringRef mapperNameStr) {
2397+ if (converter.getModuleOp ().lookupSymbol (mapperNameStr))
2398+ return mlir::FlatSymbolRefAttr::get (&converter.getMLIRContext (),
2399+ mapperNameStr);
2400+
23982401 fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
23992402
24002403 // Save current insertion point before moving to the module scope to create
2401- // the DeclareMapperOp
2404+ // the DeclareMapperOp.
24022405 mlir::OpBuilder::InsertionGuard guard (firOpBuilder);
24032406
24042407 firOpBuilder.setInsertionPointToStart (converter.getModuleOp ().getBody ());
@@ -2429,11 +2432,8 @@ genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
24292432 // Return a reference to the contents of a derived type with one field.
24302433 // Also return the field type.
24312434 const auto getFieldRef =
2432- [&](mlir::Value rec,
2433- unsigned index) -> std::tuple<mlir::Value, mlir::Type> {
2434- auto recType = mlir::dyn_cast<fir::RecordType>(
2435- fir::unwrapPassByRefType (rec.getType ()));
2436- auto [fieldName, fieldTy] = recType.getTypeList ()[index];
2435+ [&](mlir::Value rec, llvm::StringRef fieldName, mlir::Type fieldTy,
2436+ mlir::Type recType) -> std::tuple<mlir::Value, mlir::Type> {
24372437 mlir::Value field = firOpBuilder.create <fir::FieldIndexOp>(
24382438 loc, fir::FieldType::get (recType.getContext ()), fieldName, recType,
24392439 fir::getTypeParams (rec));
@@ -2452,41 +2452,41 @@ genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
24522452 llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT;
24532453 mlir::omp::VariableCaptureKind captureKind =
24542454 mlir::omp::VariableCaptureKind::ByRef;
2455- int64_t index = 0 ;
24562455
24572456 // Populate the declareMapper region with the map information.
2458- for (const auto &[memberName, memberType] :
2459- mlir::dyn_cast<fir::RecordType>(recordType).getTypeList ()) {
2460- auto [ref, type] = getFieldRef (declareOp.getBase (), index);
2457+ for (const auto &entry : llvm::enumerate (
2458+ mlir::dyn_cast<fir::RecordType>(recordType).getTypeList ())) {
2459+ const auto &memberName = entry.value ().first ;
2460+ const auto &memberType = entry.value ().second ;
2461+ auto [ref, type] =
2462+ getFieldRef (declareOp.getBase (), memberName, memberType, recordType);
24612463 mlir::FlatSymbolRefAttr mapperId;
24622464 if (auto recType = mlir::dyn_cast<fir::RecordType>(memberType)) {
24632465 std::string mapperIdName =
2464- recType.getName ().str () + " . omp.default.mapper " ;
2466+ recType.getName ().str () + llvm:: omp::OmpDefaultMapperName ;
24652467 if (auto *sym = converter.getCurrentScope ().FindSymbol (mapperIdName))
24662468 mapperIdName = converter.mangleName (mapperIdName, sym->owner ());
24672469 else if (auto *sym = converter.getCurrentScope ().FindSymbol (memberName))
24682470 mapperIdName = converter.mangleName (mapperIdName, sym->owner ());
24692471
2470- if (converter.getModuleOp ().lookupSymbol (mapperIdName))
2471- mapperId = mlir::FlatSymbolRefAttr::get (&converter.getMLIRContext (),
2472- mapperIdName);
2473- else
2474- mapperId = genImplicitDefaultDeclareMapper (converter, loc, recType,
2475- mapperIdName);
2472+ mapperId = getOrGenImplicitDefaultDeclareMapper (converter, loc, recType,
2473+ mapperIdName);
24762474 }
24772475
24782476 llvm::SmallVector<mlir::Value> bounds;
24792477 genBoundsOps (ref, bounds);
24802478 mlir::Value mapOp = createMapInfoOp (
2481- firOpBuilder, loc, ref, /* varPtrPtr=*/ mlir::Value{}, " " , bounds,
2479+ firOpBuilder, loc, ref, /* varPtrPtr=*/ mlir::Value{}, /* name=*/ " " ,
2480+ bounds,
24822481 /* members=*/ {},
24832482 /* membersIndex=*/ mlir::ArrayAttr{},
24842483 static_cast <
24852484 std::underlying_type_t <llvm::omp::OpenMPOffloadMappingFlags>>(
24862485 mapFlag),
24872486 captureKind, ref.getType (), /* partialMap=*/ false , mapperId);
24882487 memberMapOps.emplace_back (mapOp);
2489- memberPlacementIndices.emplace_back (llvm::SmallVector<int64_t >{index++});
2488+ memberPlacementIndices.emplace_back (
2489+ llvm::SmallVector<int64_t >{(int64_t )entry.index ()});
24902490 }
24912491
24922492 llvm::SmallVector<mlir::Value> bounds;
@@ -2597,12 +2597,11 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
25972597 if (converter.getModuleOp ().lookupSymbol (mapperIdName))
25982598 mapperId = mlir::FlatSymbolRefAttr::get (&converter.getMLIRContext (),
25992599 mapperIdName);
2600- else
2601- mapperId = genImplicitDefaultDeclareMapper (
2602- converter, loc,
2603- mlir::cast<fir::RecordType>(
2604- converter.genType (sym.GetType ()->derivedTypeSpec ())),
2605- mapperIdName);
2600+ mapperId = getOrGenImplicitDefaultDeclareMapper (
2601+ converter, loc,
2602+ mlir::cast<fir::RecordType>(
2603+ converter.genType (sym.GetType ()->derivedTypeSpec ())),
2604+ mapperIdName);
26062605 }
26072606
26082607 fir::factory::AddrAndBoundsInfo info =
0 commit comments