[flang-commits] [flang] [flang][openacc] Allow open acc routines from other modules. (PR #136012)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Wed May 7 09:11:02 PDT 2025
================
@@ -1034,88 +1034,78 @@ void AccAttributeVisitor::AddRoutineInfoToSymbol(
Symbol &symbol, const parser::OpenACCRoutineConstruct &x) {
if (symbol.has<SubprogramDetails>()) {
Fortran::semantics::OpenACCRoutineInfo info;
- const auto &clauses = std::get<Fortran::parser::AccClauseList>(x.t);
+ std::vector<OpenACCRoutineDeviceTypeInfo *> currentDevices;
+ currentDevices.push_back(&info);
+ const auto &clauses{std::get<Fortran::parser::AccClauseList>(x.t)};
for (const Fortran::parser::AccClause &clause : clauses.v) {
- if (std::get_if<Fortran::parser::AccClause::Seq>(&clause.u)) {
- if (info.deviceTypeInfos().empty()) {
- info.set_isSeq();
- } else {
- info.deviceTypeInfos().back().set_isSeq();
+ if (const auto *dTypeClause{
+ std::get_if<Fortran::parser::AccClause::DeviceType>(&clause.u)}) {
+ currentDevices.clear();
+ for (const auto &deviceTypeExpr : dTypeClause->v.v) {
+ currentDevices.push_back(&info.add_deviceTypeInfo(deviceTypeExpr.v));
}
- } else if (const auto *gangClause =
- std::get_if<Fortran::parser::AccClause::Gang>(&clause.u)) {
- if (info.deviceTypeInfos().empty()) {
- info.set_isGang();
- } else {
- info.deviceTypeInfos().back().set_isGang();
+ } else if (std::get_if<Fortran::parser::AccClause::Nohost>(&clause.u)) {
+ info.set_isNohost();
+ } else if (std::get_if<Fortran::parser::AccClause::Seq>(&clause.u)) {
+ for (auto &device : currentDevices) {
+ device->set_isSeq();
+ }
+ } else if (std::get_if<Fortran::parser::AccClause::Vector>(&clause.u)) {
+ for (auto &device : currentDevices) {
+ device->set_isVector();
+ }
+ } else if (std::get_if<Fortran::parser::AccClause::Worker>(&clause.u)) {
+ for (auto &device : currentDevices) {
+ device->set_isWorker();
+ }
+ } else if (const auto *gangClause{
+ std::get_if<Fortran::parser::AccClause::Gang>(
+ &clause.u)}) {
+ for (auto &device : currentDevices) {
+ device->set_isGang();
}
if (gangClause->v) {
const Fortran::parser::AccGangArgList &x = *gangClause->v;
+ int numArgs{0};
for (const Fortran::parser::AccGangArg &gangArg : x.v) {
- if (const auto *dim =
- std::get_if<Fortran::parser::AccGangArg::Dim>(&gangArg.u)) {
+ CHECK(numArgs <= 1 && "expecting 0 or 1 gang dim args");
+ if (const auto *dim{std::get_if<Fortran::parser::AccGangArg::Dim>(
+ &gangArg.u)}) {
if (const auto v{EvaluateInt64(context_, dim->v)}) {
- if (info.deviceTypeInfos().empty()) {
- info.set_gangDim(*v);
- } else {
- info.deviceTypeInfos().back().set_gangDim(*v);
+ for (auto &device : currentDevices) {
+ device->set_gangDim(*v);
}
}
}
+ numArgs++;
}
}
- } else if (std::get_if<Fortran::parser::AccClause::Vector>(&clause.u)) {
- if (info.deviceTypeInfos().empty()) {
- info.set_isVector();
- } else {
- info.deviceTypeInfos().back().set_isVector();
- }
- } else if (std::get_if<Fortran::parser::AccClause::Worker>(&clause.u)) {
- if (info.deviceTypeInfos().empty()) {
- info.set_isWorker();
- } else {
- info.deviceTypeInfos().back().set_isWorker();
- }
- } else if (std::get_if<Fortran::parser::AccClause::Nohost>(&clause.u)) {
- info.set_isNohost();
- } else if (const auto *bindClause =
- std::get_if<Fortran::parser::AccClause::Bind>(&clause.u)) {
- if (const auto *name =
- std::get_if<Fortran::parser::Name>(&bindClause->v.u)) {
- if (Symbol *sym = ResolveFctName(*name)) {
- if (info.deviceTypeInfos().empty()) {
- info.set_bindName(sym->name().ToString());
- } else {
- info.deviceTypeInfos().back().set_bindName(
- sym->name().ToString());
+ } else if (const auto *bindClause{
+ std::get_if<Fortran::parser::AccClause::Bind>(
+ &clause.u)}) {
+ if (const auto *name{
+ std::get_if<Fortran::parser::Name>(&bindClause->v.u)}) {
+ if (Symbol * sym{ResolveFctName(*name)}) {
+ Symbol &ultimate{sym->GetUltimate()};
+ for (auto &device : currentDevices) {
+ device->set_bindName(SymbolRef(ultimate));
----------------
klausler wrote:
None that I know of; it's just a matter of syntactic consistency to use braces for constructor calls.
https://github.com/llvm/llvm-project/pull/136012
More information about the flang-commits
mailing list