@@ -2391,14 +2391,17 @@ genSingleOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
2391
2391
queue, item, clauseOps);
2392
2392
}
2393
2393
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
+
2398
2401
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
2399
2402
2400
2403
// Save current insertion point before moving to the module scope to create
2401
- // the DeclareMapperOp
2404
+ // the DeclareMapperOp.
2402
2405
mlir::OpBuilder::InsertionGuard guard (firOpBuilder);
2403
2406
2404
2407
firOpBuilder.setInsertionPointToStart (converter.getModuleOp ().getBody ());
@@ -2429,11 +2432,8 @@ genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
2429
2432
// Return a reference to the contents of a derived type with one field.
2430
2433
// Also return the field type.
2431
2434
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> {
2437
2437
mlir::Value field = firOpBuilder.create <fir::FieldIndexOp>(
2438
2438
loc, fir::FieldType::get (recType.getContext ()), fieldName, recType,
2439
2439
fir::getTypeParams (rec));
@@ -2452,41 +2452,41 @@ genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
2452
2452
llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT;
2453
2453
mlir::omp::VariableCaptureKind captureKind =
2454
2454
mlir::omp::VariableCaptureKind::ByRef;
2455
- int64_t index = 0 ;
2456
2455
2457
2456
// 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);
2461
2463
mlir::FlatSymbolRefAttr mapperId;
2462
2464
if (auto recType = mlir::dyn_cast<fir::RecordType>(memberType)) {
2463
2465
std::string mapperIdName =
2464
- recType.getName ().str () + " . omp.default.mapper " ;
2466
+ recType.getName ().str () + llvm:: omp::OmpDefaultMapperName ;
2465
2467
if (auto *sym = converter.getCurrentScope ().FindSymbol (mapperIdName))
2466
2468
mapperIdName = converter.mangleName (mapperIdName, sym->owner ());
2467
2469
else if (auto *sym = converter.getCurrentScope ().FindSymbol (memberName))
2468
2470
mapperIdName = converter.mangleName (mapperIdName, sym->owner ());
2469
2471
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);
2476
2474
}
2477
2475
2478
2476
llvm::SmallVector<mlir::Value> bounds;
2479
2477
genBoundsOps (ref, bounds);
2480
2478
mlir::Value mapOp = createMapInfoOp (
2481
- firOpBuilder, loc, ref, /* varPtrPtr=*/ mlir::Value{}, " " , bounds,
2479
+ firOpBuilder, loc, ref, /* varPtrPtr=*/ mlir::Value{}, /* name=*/ " " ,
2480
+ bounds,
2482
2481
/* members=*/ {},
2483
2482
/* membersIndex=*/ mlir::ArrayAttr{},
2484
2483
static_cast <
2485
2484
std::underlying_type_t <llvm::omp::OpenMPOffloadMappingFlags>>(
2486
2485
mapFlag),
2487
2486
captureKind, ref.getType (), /* partialMap=*/ false , mapperId);
2488
2487
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 ()});
2490
2490
}
2491
2491
2492
2492
llvm::SmallVector<mlir::Value> bounds;
@@ -2597,12 +2597,11 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
2597
2597
if (converter.getModuleOp ().lookupSymbol (mapperIdName))
2598
2598
mapperId = mlir::FlatSymbolRefAttr::get (&converter.getMLIRContext (),
2599
2599
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);
2606
2605
}
2607
2606
2608
2607
fir::factory::AddrAndBoundsInfo info =
0 commit comments