[flang] Add coarray lowering hooks.
authorEric Schweitz <eschweitz@nvidia.com>
Mon, 29 Jun 2020 17:28:12 +0000 (10:28 -0700)
committerEric Schweitz <eschweitz@nvidia.com>
Mon, 29 Jun 2020 21:24:13 +0000 (14:24 -0700)
Differential review: https://reviews.llvm.org/D82790

flang/include/flang/Lower/Coarray.h [new file with mode: 0644]
flang/lib/Lower/CMakeLists.txt
flang/lib/Lower/Coarray.cpp [new file with mode: 0644]

diff --git a/flang/include/flang/Lower/Coarray.h b/flang/include/flang/Lower/Coarray.h
new file mode 100644 (file)
index 0000000..e32c82d
--- /dev/null
@@ -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
index 5409c80..7e74ac8 100644 (file)
@@ -4,6 +4,7 @@ get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
 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 (file)
index 0000000..d73acbe
--- /dev/null
@@ -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");
+}