@@ -3184,7 +3184,8 @@ genACCHostDataOp(Fortran::lower::AbstractConverter &converter,
31843184 Fortran::lower::pft::Evaluation &eval,
31853185 Fortran::semantics::SemanticsContext &semanticsContext,
31863186 Fortran::lower::StatementContext &stmtCtx,
3187- const Fortran::parser::AccClauseList &accClauseList) {
3187+ const Fortran::parser::AccClauseList &accClauseList,
3188+ Fortran::lower::SymMap &localSymbols) {
31883189 mlir::Value ifCond;
31893190 llvm::SmallVector<mlir::Value> dataOperands;
31903191 bool addIfPresentAttr = false ;
@@ -3199,6 +3200,19 @@ genACCHostDataOp(Fortran::lower::AbstractConverter &converter,
31993200 } else if (const auto *useDevice =
32003201 std::get_if<Fortran::parser::AccClause::UseDevice>(
32013202 &clause.u )) {
3203+ // When CUDA Fotran is enabled, extra symbols are used in the host_data
3204+ // region. Look for them and bind their values with the symbols in the
3205+ // outer scope.
3206+ if (semanticsContext.IsEnabled (Fortran::common::LanguageFeature::CUDA)) {
3207+ const Fortran::parser::AccObjectList &objectList{useDevice->v };
3208+ for (const auto &accObject : objectList.v ) {
3209+ Fortran::semantics::Symbol &symbol =
3210+ getSymbolFromAccObject (accObject);
3211+ const Fortran::semantics::Symbol *baseSym =
3212+ localSymbols.lookupSymbolByName (symbol.name ().ToString ());
3213+ localSymbols.copySymbolBinding (*baseSym, symbol);
3214+ }
3215+ }
32023216 genDataOperandOperations<mlir::acc::UseDeviceOp>(
32033217 useDevice->v , converter, semanticsContext, stmtCtx, dataOperands,
32043218 mlir::acc::DataClause::acc_use_device,
@@ -3239,11 +3253,11 @@ genACCHostDataOp(Fortran::lower::AbstractConverter &converter,
32393253 hostDataOp.setIfPresentAttr (builder.getUnitAttr ());
32403254}
32413255
3242- static void
3243- genACC ( Fortran::lower::AbstractConverter &converter ,
3244- Fortran::semantics::SemanticsContext &semanticsContext ,
3245- Fortran::lower::pft::Evaluation &eval ,
3246- const Fortran::parser::OpenACCBlockConstruct &blockConstruct ) {
3256+ static void genACC (Fortran::lower::AbstractConverter &converter,
3257+ Fortran::semantics::SemanticsContext &semanticsContext ,
3258+ Fortran::lower::pft::Evaluation &eval ,
3259+ const Fortran::parser::OpenACCBlockConstruct &blockConstruct ,
3260+ Fortran::lower::SymMap &localSymbols ) {
32473261 const auto &beginBlockDirective =
32483262 std::get<Fortran::parser::AccBeginBlockDirective>(blockConstruct.t );
32493263 const auto &blockDirective =
@@ -3273,7 +3287,7 @@ genACC(Fortran::lower::AbstractConverter &converter,
32733287 accClauseList);
32743288 } else if (blockDirective.v == llvm::acc::ACCD_host_data) {
32753289 genACCHostDataOp (converter, currentLocation, eval, semanticsContext,
3276- stmtCtx, accClauseList);
3290+ stmtCtx, accClauseList, localSymbols );
32773291 }
32783292}
32793293
@@ -4647,13 +4661,15 @@ mlir::Value Fortran::lower::genOpenACCConstruct(
46474661 Fortran::lower::AbstractConverter &converter,
46484662 Fortran::semantics::SemanticsContext &semanticsContext,
46494663 Fortran::lower::pft::Evaluation &eval,
4650- const Fortran::parser::OpenACCConstruct &accConstruct) {
4664+ const Fortran::parser::OpenACCConstruct &accConstruct,
4665+ Fortran::lower::SymMap &localSymbols) {
46514666
46524667 mlir::Value exitCond;
46534668 Fortran::common::visit (
46544669 common::visitors{
46554670 [&](const Fortran::parser::OpenACCBlockConstruct &blockConstruct) {
4656- genACC (converter, semanticsContext, eval, blockConstruct);
4671+ genACC (converter, semanticsContext, eval, blockConstruct,
4672+ localSymbols);
46574673 },
46584674 [&](const Fortran::parser::OpenACCCombinedConstruct
46594675 &combinedConstruct) {
0 commit comments