[flang] Add coarray lowering hooks.

Differential review: https://reviews.llvm.org/D82790
This commit is contained in:
Eric Schweitz 2020-06-29 10:28:12 -07:00
parent af9cc2d2af
commit bd2c3014e1
3 changed files with 152 additions and 0 deletions

View File

@ -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

View 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

View File

@ -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");
}