forked from OSchip/llvm-project
273 lines
6.9 KiB
C++
273 lines
6.9 KiB
C++
//===-- Lower/DumpEvaluateExpr.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/Lower/DumpEvaluateExpr.h"
|
|
#include <iostream>
|
|
|
|
static constexpr char whiteSpacePadding[] =
|
|
">> ";
|
|
static constexpr auto whiteSize = sizeof(whiteSpacePadding) - 1;
|
|
|
|
inline const char *Fortran::lower::DumpEvaluateExpr::getIndentString() const {
|
|
auto count = (level * 2 >= whiteSize) ? whiteSize : level * 2;
|
|
return whiteSpacePadding + whiteSize - count;
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::CoarrayRef &x) {
|
|
indent("coarray ref");
|
|
show(x.base());
|
|
show(x.subscript());
|
|
show(x.cosubscript());
|
|
show(x.stat());
|
|
show(x.team());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::BOZLiteralConstant &) {
|
|
print("BOZ literal constant");
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::NullPointer &) {
|
|
print("null pointer");
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::semantics::Symbol &symbol) {
|
|
const auto &ultimate{symbol.GetUltimate()};
|
|
print("symbol: "s + std::string(toStringRef(symbol.name())));
|
|
if (const auto *assoc =
|
|
ultimate.detailsIf<Fortran::semantics::AssocEntityDetails>()) {
|
|
indent("assoc details");
|
|
show(assoc->expr());
|
|
outdent();
|
|
}
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::StaticDataObject &) {
|
|
print("static data object");
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::ImpliedDoIndex &) {
|
|
print("implied do index");
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::BaseObject &x) {
|
|
indent("base object");
|
|
show(x.u);
|
|
outdent();
|
|
}
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::Component &x) {
|
|
indent("component");
|
|
show(x.base());
|
|
show(x.GetLastSymbol());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::NamedEntity &x) {
|
|
indent("named entity");
|
|
if (const auto *component = x.UnwrapComponent())
|
|
show(*component);
|
|
else
|
|
show(x.GetFirstSymbol());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::TypeParamInquiry &x) {
|
|
indent("type inquiry");
|
|
show(x.base());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::Triplet &x) {
|
|
indent("triplet");
|
|
show(x.lower());
|
|
show(x.upper());
|
|
show(x.stride());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::Subscript &x) {
|
|
indent("subscript");
|
|
show(x.u);
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::ArrayRef &x) {
|
|
indent("array ref");
|
|
show(x.base());
|
|
show(x.subscript());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::DataRef &x) {
|
|
indent("data ref");
|
|
show(x.u);
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::Substring &x) {
|
|
indent("substring");
|
|
show(x.parent());
|
|
show(x.lower());
|
|
show(x.upper());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::semantics::ParamValue &x) {
|
|
indent("param value");
|
|
show(x.GetExplicit());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::semantics::DerivedTypeSpec::ParameterMapType::value_type
|
|
&x) {
|
|
show(x.second);
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::semantics::DerivedTypeSpec &x) {
|
|
indent("derived type spec");
|
|
for (auto &v : x.parameters())
|
|
show(v);
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::StructureConstructorValues::value_type &x) {
|
|
show(x.second);
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::StructureConstructor &x) {
|
|
indent("structure constructor");
|
|
show(x.derivedTypeSpec());
|
|
for (auto &v : x)
|
|
show(v);
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &x) {
|
|
indent("expr some type");
|
|
show(x.u);
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::ComplexPart &x) {
|
|
indent("complex part");
|
|
show(x.complex());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::ActualArgument &x) {
|
|
indent("actual argument");
|
|
if (const auto *symbol = x.GetAssumedTypeDummy())
|
|
show(*symbol);
|
|
else
|
|
show(x.UnwrapExpr());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::ProcedureDesignator &x) {
|
|
indent("procedure designator");
|
|
if (const auto *component = x.GetComponent())
|
|
show(*component);
|
|
else if (const auto *symbol = x.GetSymbol())
|
|
show(*symbol);
|
|
else
|
|
show(DEREF(x.GetSpecificIntrinsic()));
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::SpecificIntrinsic &) {
|
|
print("specific intrinsic");
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::show(
|
|
const Fortran::evaluate::DescriptorInquiry &x) {
|
|
indent("descriptor inquiry");
|
|
show(x.base());
|
|
outdent();
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::print(llvm::Twine twine) {
|
|
outs << getIndentString() << twine << '\n';
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::indent(llvm::StringRef s) {
|
|
print(s + " {");
|
|
level++;
|
|
}
|
|
|
|
void Fortran::lower::DumpEvaluateExpr::outdent() {
|
|
if (level)
|
|
level--;
|
|
print("}");
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Boilerplate entry points that the debugger can find.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
void Fortran::lower::dumpEvExpr(const Fortran::semantics::SomeExpr &x) {
|
|
DumpEvaluateExpr::dump(x);
|
|
}
|
|
|
|
void Fortran::lower::dumpEvExpr(
|
|
const Fortran::evaluate::Expr<
|
|
Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>>
|
|
&x) {
|
|
DumpEvaluateExpr::dump(x);
|
|
}
|
|
|
|
void Fortran::lower::dumpEvExpr(
|
|
const Fortran::evaluate::Expr<
|
|
Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>
|
|
&x) {
|
|
DumpEvaluateExpr::dump(x);
|
|
}
|
|
|
|
void Fortran::lower::dumpEvExpr(const Fortran::evaluate::ArrayRef &x) {
|
|
DumpEvaluateExpr::dump(x);
|
|
}
|
|
|
|
void Fortran::lower::dumpEvExpr(const Fortran::evaluate::DataRef &x) {
|
|
DumpEvaluateExpr::dump(x);
|
|
}
|
|
|
|
void Fortran::lower::dumpEvExpr(const Fortran::evaluate::Substring &x) {
|
|
DumpEvaluateExpr::dump(x);
|
|
}
|
|
|
|
void Fortran::lower::dumpEvExpr(
|
|
const Fortran::evaluate::Designator<
|
|
Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>>
|
|
&x) {
|
|
DumpEvaluateExpr::dump(x);
|
|
}
|