diff --git a/flang/include/flang/Lower/Coarray.h b/flang/include/flang/Lower/Coarray.h new file mode 100644 --- /dev/null +++ b/flang/include/flang/Lower/Coarray.h @@ -0,0 +1,78 @@ +//===-- Lower/Coarray.h -- image related lowering ---------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_LOWER_COARRAY_H +#define FORTRAN_LOWER_COARRAY_H + +#include "flang/Lower/AbstractConverter.h" +#include "flang/Lower/Support/BoxValue.h" + +namespace Fortran { + +namespace parser { +struct ChangeTeamConstruct; +struct ChangeTeamStmt; +struct EndChangeTeamStmt; +struct FormTeamStmt; +} // namespace parser + +namespace evaluate { +class CoarrayRef; +} // namespace evaluate + +namespace lower { + +class SymMap; + +namespace pft { +struct Evaluation; +} // namespace pft + +//===----------------------------------------------------------------------===// +// TEAM constructs +//===----------------------------------------------------------------------===// + +void genChangeTeamConstruct(AbstractConverter &, pft::Evaluation &eval, + const parser::ChangeTeamConstruct &); +void genChangeTeamStmt(AbstractConverter &, pft::Evaluation &eval, + const parser::ChangeTeamStmt &); +void genEndChangeTeamStmt(AbstractConverter &, pft::Evaluation &eval, + const parser::EndChangeTeamStmt &); +void genFormTeamStatement(AbstractConverter &, pft::Evaluation &eval, + const parser::FormTeamStmt &); + +//===----------------------------------------------------------------------===// +// COARRAY expressions +//===----------------------------------------------------------------------===// + +/// Coarray expression lowering helper. A coarray expression is expected to be +/// lowered into runtime support calls. For example, expressions may use a +/// message-passing runtime to access another image's data. +class CoarrayExprHelper { +public: + explicit CoarrayExprHelper(AbstractConverter &converter, mlir::Location loc, + SymMap &syms) + : converter{converter}, symMap{syms}, loc{loc} {} + CoarrayExprHelper(const CoarrayExprHelper &) = delete; + + /// Generate the address of a co-array expression. + fir::ExtendedValue genAddr(const evaluate::CoarrayRef &expr); + + /// Generate the value of a co-array expression. + fir::ExtendedValue genValue(const evaluate::CoarrayRef &expr); + +private: + AbstractConverter &converter; + SymMap &symMap; + mlir::Location loc; +}; + +} // namespace lower +} // namespace Fortran + +#endif // FORTRAN_LOWER_COARRAY_H diff --git a/flang/lib/Lower/CMakeLists.txt b/flang/lib/Lower/CMakeLists.txt --- a/flang/lib/Lower/CMakeLists.txt +++ b/flang/lib/Lower/CMakeLists.txt @@ -4,6 +4,7 @@ add_flang_library(FortranLower CharacterExpr.cpp CharacterRuntime.cpp + Coarray.cpp ComplexExpr.cpp ConvertType.cpp DoLoopHelper.cpp diff --git a/flang/lib/Lower/Coarray.cpp b/flang/lib/Lower/Coarray.cpp new file mode 100644 --- /dev/null +++ b/flang/lib/Lower/Coarray.cpp @@ -0,0 +1,73 @@ +//===-- Coarray.cpp -------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// Implementation of the lowering of image related constructs and expressions. +/// Fortran images can form teams, communicate via coarrays, etc. +/// +//===----------------------------------------------------------------------===// + +#include "flang/Lower/Coarray.h" +#include "SymbolMap.h" +#include "flang/Lower/AbstractConverter.h" +#include "flang/Lower/FIRBuilder.h" +#include "flang/Parser/parse-tree.h" +#include "flang/Semantics/expression.h" + +#undef TODO +#define TODO(MSG) \ + { \ + mlir::emitError(converter.getCurrentLocation(), "not yet implemented") \ + << MSG; \ + exit(1); \ + } + +//===----------------------------------------------------------------------===// +// TEAM statements and constructs +//===----------------------------------------------------------------------===// + +void Fortran::lower::genChangeTeamConstruct( + Fortran::lower::AbstractConverter &converter, + Fortran::lower::pft::Evaluation &, + const Fortran::parser::ChangeTeamConstruct &) { + TODO("CHANGE TEAM construct"); +} + +void Fortran::lower::genChangeTeamStmt( + Fortran::lower::AbstractConverter &converter, + Fortran::lower::pft::Evaluation &, + const Fortran::parser::ChangeTeamStmt &) { + TODO("CHANGE TEAM stmt"); +} + +void Fortran::lower::genEndChangeTeamStmt( + Fortran::lower::AbstractConverter &converter, + Fortran::lower::pft::Evaluation &, + const Fortran::parser::EndChangeTeamStmt &) { + TODO("END CHANGE TEAM"); +} + +void Fortran::lower::genFormTeamStatement( + Fortran::lower::AbstractConverter &converter, + Fortran::lower::pft::Evaluation &, const Fortran::parser::FormTeamStmt &) { + TODO("FORM TEAM"); +} + +//===----------------------------------------------------------------------===// +// COARRAY expressions +//===----------------------------------------------------------------------===// + +fir::ExtendedValue Fortran::lower::CoarrayExprHelper::genAddr( + const Fortran::evaluate::CoarrayRef &expr) { + (void)symMap; + TODO("co-array address"); +} + +fir::ExtendedValue Fortran::lower::CoarrayExprHelper::genValue( + const Fortran::evaluate::CoarrayRef &expr) { + TODO("co-array value"); +}