//===-- 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 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()) { 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 &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> &x) { DumpEvaluateExpr::dump(x); } void Fortran::lower::dumpEvExpr( const Fortran::evaluate::Expr< Fortran::evaluate::Type> &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> &x) { DumpEvaluateExpr::dump(x); }