@@ -2348,6 +2348,124 @@ genSingleOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
2348
2348
queue, item, clauseOps);
2349
2349
}
2350
2350
2351
+ static mlir::FlatSymbolRefAttr
2352
+ genImplicitDefaultDeclareMapper (lower::AbstractConverter &converter,
2353
+ mlir::Location loc, fir::RecordType recordType,
2354
+ llvm::StringRef mapperNameStr) {
2355
+ fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
2356
+ lower::StatementContext stmtCtx;
2357
+
2358
+ // Save current insertion point before moving to the module scope to create
2359
+ // the DeclareMapperOp
2360
+ mlir::OpBuilder::InsertionGuard guard (firOpBuilder);
2361
+
2362
+ firOpBuilder.setInsertionPointToStart (converter.getModuleOp ().getBody ());
2363
+ auto declMapperOp = firOpBuilder.create <mlir::omp::DeclareMapperOp>(
2364
+ loc, mapperNameStr, recordType);
2365
+ auto ®ion = declMapperOp.getRegion ();
2366
+ firOpBuilder.createBlock (®ion);
2367
+ auto mapperArg = region.addArgument (firOpBuilder.getRefType (recordType), loc);
2368
+
2369
+ auto declareOp =
2370
+ firOpBuilder.create <hlfir::DeclareOp>(loc, mapperArg, /* uniq_name=*/ " " );
2371
+
2372
+ const auto genBoundsOps = [&](mlir::Value mapVal,
2373
+ llvm::SmallVectorImpl<mlir::Value> &bounds) {
2374
+ fir::ExtendedValue extVal =
2375
+ hlfir::translateToExtendedValue (mapVal.getLoc (), firOpBuilder,
2376
+ hlfir::Entity{mapVal},
2377
+ /* contiguousHint=*/ true )
2378
+ .first ;
2379
+ fir::factory::AddrAndBoundsInfo info = fir::factory::getDataOperandBaseAddr (
2380
+ firOpBuilder, mapVal, /* isOptional=*/ false , mapVal.getLoc ());
2381
+ bounds = fir::factory::genImplicitBoundsOps<mlir::omp::MapBoundsOp,
2382
+ mlir::omp::MapBoundsType>(
2383
+ firOpBuilder, info, extVal,
2384
+ /* dataExvIsAssumedSize=*/ false , mapVal.getLoc ());
2385
+ };
2386
+
2387
+ // Return a reference to the contents of a derived type with one field.
2388
+ // Also return the field type.
2389
+ const auto getFieldRef =
2390
+ [&](mlir::Value rec,
2391
+ unsigned index ) -> std::tuple<mlir::Value, mlir::Type> {
2392
+ auto recType = mlir::dyn_cast<fir::RecordType>(
2393
+ fir::unwrapPassByRefType (rec.getType ()));
2394
+ auto [fieldName, fieldTy] = recType.getTypeList ()[index ];
2395
+ mlir::Value field = firOpBuilder.create <fir::FieldIndexOp>(
2396
+ loc, fir::FieldType::get (recType.getContext ()), fieldName, recType,
2397
+ fir::getTypeParams (rec));
2398
+ return {firOpBuilder.create <fir::CoordinateOp>(
2399
+ loc, firOpBuilder.getRefType (fieldTy), rec, field),
2400
+ fieldTy};
2401
+ };
2402
+
2403
+ mlir::omp::DeclareMapperInfoOperands clauseOps;
2404
+ llvm::SmallVector<llvm::SmallVector<int64_t >> memberPlacementIndices;
2405
+ llvm::SmallVector<mlir::Value> memberMapOps;
2406
+
2407
+ llvm::omp::OpenMPOffloadMappingFlags mapFlag =
2408
+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO |
2409
+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM |
2410
+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT;
2411
+ mlir::omp::VariableCaptureKind captureKind =
2412
+ mlir::omp::VariableCaptureKind::ByRef;
2413
+ int64_t index = 0 ;
2414
+
2415
+ // Populate the declareMapper region with the map information.
2416
+ for (const auto &[memberName, memberType] :
2417
+ mlir::dyn_cast<fir::RecordType>(recordType).getTypeList ()) {
2418
+ auto [ref, type] = getFieldRef (declareOp.getBase (), index );
2419
+ mlir::FlatSymbolRefAttr mapperId;
2420
+ if (auto recType = mlir::dyn_cast<fir::RecordType>(memberType)) {
2421
+ std::string mapperIdName =
2422
+ recType.getName ().str () + " .omp.default.mapper" ;
2423
+ if (auto *sym = converter.getCurrentScope ().FindSymbol (mapperIdName))
2424
+ mapperIdName = converter.mangleName (mapperIdName, sym->owner ());
2425
+ else if (auto *sym = converter.getCurrentScope ().FindSymbol (memberName))
2426
+ mapperIdName = converter.mangleName (mapperIdName, sym->owner ());
2427
+
2428
+ if (converter.getModuleOp ().lookupSymbol (mapperIdName))
2429
+ mapperId = mlir::FlatSymbolRefAttr::get (&converter.getMLIRContext (),
2430
+ mapperIdName);
2431
+ else
2432
+ mapperId = genImplicitDefaultDeclareMapper (converter, loc, recType,
2433
+ mapperIdName);
2434
+ }
2435
+
2436
+ llvm::SmallVector<mlir::Value> bounds;
2437
+ genBoundsOps (ref, bounds);
2438
+ mlir::Value mapOp = createMapInfoOp (
2439
+ firOpBuilder, loc, ref, /* varPtrPtr=*/ mlir::Value{}, " " , bounds,
2440
+ /* members=*/ {},
2441
+ /* membersIndex=*/ mlir::ArrayAttr{},
2442
+ static_cast <
2443
+ std::underlying_type_t <llvm::omp::OpenMPOffloadMappingFlags>>(
2444
+ mapFlag),
2445
+ captureKind, ref.getType (), /* partialMap=*/ false , mapperId);
2446
+ memberMapOps.emplace_back (mapOp);
2447
+ memberPlacementIndices.emplace_back (llvm::SmallVector<int64_t >{index ++});
2448
+ }
2449
+
2450
+ llvm::SmallVector<mlir::Value> bounds;
2451
+ genBoundsOps (declareOp.getOriginalBase (), bounds);
2452
+ mlir::omp::MapInfoOp mapOp = createMapInfoOp (
2453
+ firOpBuilder, loc, declareOp.getOriginalBase (),
2454
+ /* varPtrPtr=*/ mlir::Value (), /* name=*/ " " , bounds, memberMapOps,
2455
+ firOpBuilder.create2DI64ArrayAttr (memberPlacementIndices),
2456
+ static_cast <std::underlying_type_t <llvm::omp::OpenMPOffloadMappingFlags>>(
2457
+ mapFlag),
2458
+ captureKind, declareOp.getType (0 ),
2459
+ /* partialMap=*/ true );
2460
+
2461
+ clauseOps.mapVars .emplace_back (mapOp);
2462
+
2463
+ firOpBuilder.create <mlir::omp::DeclareMapperInfoOp>(loc, clauseOps.mapVars );
2464
+ // declMapperOp->dumpPretty();
2465
+ return mlir::FlatSymbolRefAttr::get (&converter.getMLIRContext (),
2466
+ mapperNameStr);
2467
+ }
2468
+
2351
2469
static mlir::omp::TargetOp
2352
2470
genTargetOp (lower::AbstractConverter &converter, lower::SymMap &symTable,
2353
2471
lower::StatementContext &stmtCtx,
@@ -2420,15 +2538,26 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
2420
2538
name << sym.name ().ToString ();
2421
2539
2422
2540
mlir::FlatSymbolRefAttr mapperId;
2423
- if (sym.GetType ()->category () == semantics::DeclTypeSpec::TypeDerived) {
2541
+ if (sym.GetType ()->category () == semantics::DeclTypeSpec::TypeDerived &&
2542
+ defaultMaps.empty ()) {
2424
2543
auto &typeSpec = sym.GetType ()->derivedTypeSpec ();
2425
2544
std::string mapperIdName =
2426
2545
typeSpec.name ().ToString () + " .omp.default.mapper" ;
2427
2546
if (auto *sym = converter.getCurrentScope ().FindSymbol (mapperIdName))
2428
2547
mapperIdName = converter.mangleName (mapperIdName, sym->owner ());
2548
+ else
2549
+ mapperIdName =
2550
+ converter.mangleName (mapperIdName, *typeSpec.GetScope ());
2551
+
2429
2552
if (converter.getModuleOp ().lookupSymbol (mapperIdName))
2430
2553
mapperId = mlir::FlatSymbolRefAttr::get (&converter.getMLIRContext (),
2431
2554
mapperIdName);
2555
+ else
2556
+ mapperId = genImplicitDefaultDeclareMapper (
2557
+ converter, loc,
2558
+ mlir::cast<fir::RecordType>(
2559
+ converter.genType (sym.GetType ()->derivedTypeSpec ())),
2560
+ mapperIdName);
2432
2561
}
2433
2562
2434
2563
fir::factory::AddrAndBoundsInfo info =
@@ -4039,6 +4168,7 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
4039
4168
ClauseProcessor cp (converter, semaCtx, clauses);
4040
4169
cp.processMap (loc, stmtCtx, clauseOps);
4041
4170
firOpBuilder.create <mlir::omp::DeclareMapperInfoOp>(loc, clauseOps.mapVars );
4171
+ // declMapperOp->dumpPretty();
4042
4172
}
4043
4173
4044
4174
static void
0 commit comments