@@ -765,14 +765,14 @@ static void getDeclareTargetInfo(
765765 lower::pft::Evaluation &eval,
766766 const parser::OpenMPDeclareTargetConstruct &declareTargetConstruct,
767767 mlir::omp::DeclareTargetOperands &clauseOps,
768- llvm::SmallVectorImpl<DeclareTargetCapturePair > &symbolAndClause) {
768+ llvm::SmallVectorImpl<DeclareTargetCaptureInfo > &symbolAndClause) {
769769 const auto &spec =
770770 std::get<parser::OmpDeclareTargetSpecifier>(declareTargetConstruct.t );
771771 if (const auto *objectList{parser::Unwrap<parser::OmpObjectList>(spec.u )}) {
772772 ObjectList objects{makeObjects (*objectList, semaCtx)};
773773 // Case: declare target(func, var1, var2)
774774 gatherFuncAndVarSyms (objects, mlir::omp::DeclareTargetCaptureClause::to,
775- symbolAndClause);
775+ symbolAndClause, /* automap= */ false );
776776 } else if (const auto *clauseList{
777777 parser::Unwrap<parser::OmpClauseList>(spec.u )}) {
778778 List<Clause> clauses = makeClauses (*clauseList, semaCtx);
@@ -805,21 +805,20 @@ static void collectDeferredDeclareTargets(
805805 llvm::SmallVectorImpl<lower::OMPDeferredDeclareTargetInfo>
806806 &deferredDeclareTarget) {
807807 mlir::omp::DeclareTargetOperands clauseOps;
808- llvm::SmallVector<DeclareTargetCapturePair > symbolAndClause;
808+ llvm::SmallVector<DeclareTargetCaptureInfo > symbolAndClause;
809809 getDeclareTargetInfo (converter, semaCtx, eval, declareTargetConstruct,
810810 clauseOps, symbolAndClause);
811811 // Return the device type only if at least one of the targets for the
812812 // directive is a function or subroutine
813813 mlir::ModuleOp mod = converter.getFirOpBuilder ().getModule ();
814814
815- for (const DeclareTargetCapturePair &symClause : symbolAndClause) {
816- mlir::Operation *op = mod. lookupSymbol (
817- converter.mangleName (std::get< const semantics::Symbol &>( symClause) ));
815+ for (const DeclareTargetCaptureInfo &symClause : symbolAndClause) {
816+ mlir::Operation *op =
817+ mod. lookupSymbol ( converter.mangleName (symClause. symbol ));
818818
819819 if (!op) {
820- deferredDeclareTarget.push_back ({std::get<0 >(symClause),
821- clauseOps.deviceType ,
822- std::get<1 >(symClause)});
820+ deferredDeclareTarget.push_back ({symClause.clause , clauseOps.deviceType ,
821+ symClause.automap , symClause.symbol });
823822 }
824823 }
825824}
@@ -830,16 +829,16 @@ getDeclareTargetFunctionDevice(
830829 lower::pft::Evaluation &eval,
831830 const parser::OpenMPDeclareTargetConstruct &declareTargetConstruct) {
832831 mlir::omp::DeclareTargetOperands clauseOps;
833- llvm::SmallVector<DeclareTargetCapturePair > symbolAndClause;
832+ llvm::SmallVector<DeclareTargetCaptureInfo > symbolAndClause;
834833 getDeclareTargetInfo (converter, semaCtx, eval, declareTargetConstruct,
835834 clauseOps, symbolAndClause);
836835
837836 // Return the device type only if at least one of the targets for the
838837 // directive is a function or subroutine
839838 mlir::ModuleOp mod = converter.getFirOpBuilder ().getModule ();
840- for (const DeclareTargetCapturePair &symClause : symbolAndClause) {
841- mlir::Operation *op = mod. lookupSymbol (
842- converter.mangleName (std::get< const semantics::Symbol &>( symClause) ));
839+ for (const DeclareTargetCaptureInfo &symClause : symbolAndClause) {
840+ mlir::Operation *op =
841+ mod. lookupSymbol ( converter.mangleName (symClause. symbol ));
843842
844843 if (mlir::isa_and_nonnull<mlir::func::FuncOp>(op))
845844 return clauseOps.deviceType ;
@@ -1056,7 +1055,7 @@ getImplicitMapTypeAndKind(fir::FirOpBuilder &firOpBuilder,
10561055static void
10571056markDeclareTarget (mlir::Operation *op, lower::AbstractConverter &converter,
10581057 mlir::omp::DeclareTargetCaptureClause captureClause,
1059- mlir::omp::DeclareTargetDeviceType deviceType) {
1058+ mlir::omp::DeclareTargetDeviceType deviceType, bool automap ) {
10601059 // TODO: Add support for program local variables with declare target applied
10611060 auto declareTargetOp = llvm::dyn_cast<mlir::omp::DeclareTargetInterface>(op);
10621061 if (!declareTargetOp)
@@ -1071,11 +1070,11 @@ markDeclareTarget(mlir::Operation *op, lower::AbstractConverter &converter,
10711070 if (declareTargetOp.isDeclareTarget ()) {
10721071 if (declareTargetOp.getDeclareTargetDeviceType () != deviceType)
10731072 declareTargetOp.setDeclareTarget (mlir::omp::DeclareTargetDeviceType::any,
1074- captureClause);
1073+ captureClause, automap );
10751074 return ;
10761075 }
10771076
1078- declareTargetOp.setDeclareTarget (deviceType, captureClause);
1077+ declareTargetOp.setDeclareTarget (deviceType, captureClause, automap );
10791078}
10801079
10811080// ===----------------------------------------------------------------------===//
@@ -3564,25 +3563,23 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
35643563 semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
35653564 const parser::OpenMPDeclareTargetConstruct &declareTargetConstruct) {
35663565 mlir::omp::DeclareTargetOperands clauseOps;
3567- llvm::SmallVector<DeclareTargetCapturePair > symbolAndClause;
3566+ llvm::SmallVector<DeclareTargetCaptureInfo > symbolAndClause;
35683567 mlir::ModuleOp mod = converter.getFirOpBuilder ().getModule ();
35693568 getDeclareTargetInfo (converter, semaCtx, eval, declareTargetConstruct,
35703569 clauseOps, symbolAndClause);
35713570
3572- for (const DeclareTargetCapturePair &symClause : symbolAndClause) {
3573- mlir::Operation *op = mod. lookupSymbol (
3574- converter.mangleName (std::get< const semantics::Symbol &>( symClause) ));
3571+ for (const DeclareTargetCaptureInfo &symClause : symbolAndClause) {
3572+ mlir::Operation *op =
3573+ mod. lookupSymbol ( converter.mangleName (symClause. symbol ));
35753574
35763575 // Some symbols are deferred until later in the module, these are handled
35773576 // upon finalization of the module for OpenMP inside of Bridge, so we simply
35783577 // skip for now.
35793578 if (!op)
35803579 continue ;
35813580
3582- markDeclareTarget (
3583- op, converter,
3584- std::get<mlir::omp::DeclareTargetCaptureClause>(symClause),
3585- clauseOps.deviceType );
3581+ markDeclareTarget (op, converter, symClause.clause , clauseOps.deviceType ,
3582+ symClause.automap );
35863583 }
35873584}
35883585
@@ -4176,7 +4173,7 @@ bool Fortran::lower::markOpenMPDeferredDeclareTargetFunctions(
41764173 deviceCodeFound = true ;
41774174
41784175 markDeclareTarget (op, converter, declTar.declareTargetCaptureClause ,
4179- devType);
4176+ devType, declTar. automap );
41804177 }
41814178
41824179 return deviceCodeFound;
0 commit comments