| //===-- ConvertExpr.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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "flang/Common/idioms.h" |
| #include "flang/Lower/IntrinsicCall.h" |
| #include "flang/Lower/Support/BoxValue.h" |
| |
| mlir::Value fir::getBase(const fir::ExtendedValue &ex) { |
| return std::visit(Fortran::common::visitors{ |
| [](const fir::UnboxedValue &x) { return x; }, |
| [](const auto &x) { return x.getAddr(); }, |
| }, |
| ex.box); |
| } |
| |
| llvm::raw_ostream &fir::operator<<(llvm::raw_ostream &os, |
| const fir::CharBoxValue &box) { |
| os << "boxchar { addr: " << box.getAddr() << ", len: " << box.getLen() |
| << " }"; |
| return os; |
| } |
| |
| llvm::raw_ostream &fir::operator<<(llvm::raw_ostream &os, |
| const fir::ArrayBoxValue &box) { |
| os << "boxarray { addr: " << box.getAddr(); |
| if (box.getLBounds().size()) { |
| os << ", lbounds: ["; |
| llvm::interleaveComma(box.getLBounds(), os); |
| os << "]"; |
| } else { |
| os << ", lbounds: all-ones"; |
| } |
| os << ", shape: ["; |
| llvm::interleaveComma(box.getExtents(), os); |
| os << "]}"; |
| return os; |
| } |
| |
| llvm::raw_ostream &fir::operator<<(llvm::raw_ostream &os, |
| const fir::CharArrayBoxValue &box) { |
| os << "boxchararray { addr: " << box.getAddr() << ", len : " << box.getLen(); |
| if (box.getLBounds().size()) { |
| os << ", lbounds: ["; |
| llvm::interleaveComma(box.getLBounds(), os); |
| os << "]"; |
| } else { |
| os << " lbounds: all-ones"; |
| } |
| os << ", shape: ["; |
| llvm::interleaveComma(box.getExtents(), os); |
| os << "]}"; |
| return os; |
| } |
| |
| llvm::raw_ostream &fir::operator<<(llvm::raw_ostream &os, |
| const fir::BoxValue &box) { |
| os << "box { addr: " << box.getAddr(); |
| if (box.getLen()) |
| os << ", size: " << box.getLen(); |
| if (box.params.size()) { |
| os << ", type params: ["; |
| llvm::interleaveComma(box.params, os); |
| os << "]"; |
| } |
| if (box.getLBounds().size()) { |
| os << ", lbounds: ["; |
| llvm::interleaveComma(box.getLBounds(), os); |
| os << "]"; |
| } |
| if (box.getExtents().size()) { |
| os << ", shape: ["; |
| llvm::interleaveComma(box.getExtents(), os); |
| os << "]"; |
| } |
| os << "}"; |
| return os; |
| } |
| |
| llvm::raw_ostream &fir::operator<<(llvm::raw_ostream &os, |
| const fir::ProcBoxValue &box) { |
| os << "boxproc: { addr: " << box.getAddr() << ", context: " << box.hostContext |
| << "}"; |
| return os; |
| } |
| |
| llvm::raw_ostream &fir::operator<<(llvm::raw_ostream &os, |
| const fir::ExtendedValue &ex) { |
| std::visit([&](const auto &value) { os << value; }, ex.box); |
| return os; |
| } |