//===-- 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/Optimizer/Builder/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