From 6e2c547ad7469d2bf13fdac9f0d006d69bae0cfe Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Thu, 12 Dec 2024 10:53:13 -0800 Subject: [PATCH 1/2] [flang][cuda] Implicitly add DEVICE attribute in device/global functions --- flang/lib/Semantics/resolve-names.cpp | 19 +++++++++++++++++++ flang/test/Semantics/modfile55.cuf | 1 + 2 files changed, 20 insertions(+) diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index b576f59e8c7e5..a38c86e683b6b 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -8953,6 +8953,18 @@ void ResolveNamesVisitor::FinishSpecificationPart( misparsedStmtFuncFound_ = false; funcResultStack().CompleteFunctionResultType(); CheckImports(); + bool inDeviceSubprogram = false; + if (auto *subp{currScope().symbol() + ? currScope().symbol()->detailsIf() + : nullptr}) { + if (auto attrs{subp->cudaSubprogramAttrs()}) { + if (*attrs != common::CUDASubprogramAttrs::Device || + *attrs != common::CUDASubprogramAttrs::Global || + *attrs != common::CUDASubprogramAttrs::Grid_Global) { + inDeviceSubprogram = true; + } + } + } for (auto &pair : currScope()) { auto &symbol{*pair.second}; if (inInterfaceBlock()) { @@ -8961,6 +8973,13 @@ void ResolveNamesVisitor::FinishSpecificationPart( if (NeedsExplicitType(symbol)) { ApplyImplicitRules(symbol); } + if (inDeviceSubprogram && IsDummy(symbol) && symbol.has()) { + auto *dummy{symbol.detailsIf()}; + if (!dummy->cudaDataAttr()) { + // Implicitly set device attribute if none is set in device context. + dummy->set_cudaDataAttr(common::CUDADataAttr::Device); + } + } if (IsDummy(symbol) && isImplicitNoneType() && symbol.test(Symbol::Flag::Implicit) && !context().HasError(symbol)) { Say(symbol.name(), diff --git a/flang/test/Semantics/modfile55.cuf b/flang/test/Semantics/modfile55.cuf index cf01bdd5f58f6..6c0d152a382a8 100644 --- a/flang/test/Semantics/modfile55.cuf +++ b/flang/test/Semantics/modfile55.cuf @@ -29,6 +29,7 @@ end !contains !attributes(global) subroutine globsub(x,y,z) !real(4),value::x +!attributes(device) x !real(4)::y !attributes(device) y !real(4)::z From 5f343667d2a70d8ebf49488e7072d3b92451b1d1 Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Thu, 12 Dec 2024 11:01:14 -0800 Subject: [PATCH 2/2] clang-format --- flang/lib/Semantics/resolve-names.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index a38c86e683b6b..aef2898919f3f 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -8973,7 +8973,8 @@ void ResolveNamesVisitor::FinishSpecificationPart( if (NeedsExplicitType(symbol)) { ApplyImplicitRules(symbol); } - if (inDeviceSubprogram && IsDummy(symbol) && symbol.has()) { + if (inDeviceSubprogram && IsDummy(symbol) && + symbol.has()) { auto *dummy{symbol.detailsIf()}; if (!dummy->cudaDataAttr()) { // Implicitly set device attribute if none is set in device context.