//===-- Semantics/dump-expr.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/Semantics/dump-expr.h" namespace Fortran::semantics { static constexpr char whiteSpacePadding[]{ ">> "}; static constexpr auto whiteSize{sizeof(whiteSpacePadding) - 1}; inline const char *DumpEvaluateExpr::GetIndentString() const { auto count{(level_ * 2 >= whiteSize) ? whiteSize : level_ * 2}; return whiteSpacePadding + whiteSize - count; } void DumpEvaluateExpr::Show(const evaluate::CoarrayRef &x) { Indent("coarray ref"); Show(x.base()); Show(x.cosubscript()); Show(x.stat()); Show(x.team()); Outdent(); } void DumpEvaluateExpr::Show(const evaluate::BOZLiteralConstant &) { Print("BOZ literal constant"); } void DumpEvaluateExpr::Show(const evaluate::NullPointer &) { Print("null pointer"); } void DumpEvaluateExpr::Show(const Symbol &symbol) { const auto &ultimate{symbol.GetUltimate()}; Print("symbol: "s + symbol.name().ToString()); if (const auto *assoc{ultimate.detailsIf()}) { Indent("assoc details"); Show(assoc->expr()); Outdent(); } } void DumpEvaluateExpr::Show(const evaluate::StaticDataObject &) { Print("static data object"); } void DumpEvaluateExpr::Show(const evaluate::ImpliedDoIndex &) { Print("implied do index"); } void DumpEvaluateExpr::Show(const evaluate::BaseObject &x) { Indent("base object"); Show(x.u); Outdent(); } void DumpEvaluateExpr::Show(const evaluate::Component &x) { Indent("component"); Show(x.base()); Show(x.GetLastSymbol()); Outdent(); } void DumpEvaluateExpr::Show(const evaluate::NamedEntity &x) { Indent("named entity"); if (const auto *component{x.UnwrapComponent()}) { Show(*component); } else { Show(x.GetFirstSymbol()); } Outdent(); } void DumpEvaluateExpr::Show(const evaluate::TypeParamInquiry &x) { Indent("type inquiry"); Show(x.base()); Outdent(); } void DumpEvaluateExpr::Show(const evaluate::Triplet &x) { Indent("triplet"); Show(x.lower()); Show(x.upper()); Show(x.stride()); Outdent(); } void DumpEvaluateExpr::Show(const evaluate::Subscript &x) { Indent("subscript"); Show(x.u); Outdent(); } void DumpEvaluateExpr::Show(const evaluate::ArrayRef &x) { Indent("array ref"); Show(x.base()); Show(x.subscript()); Outdent(); } void DumpEvaluateExpr::Show(const evaluate::DataRef &x) { Indent("data ref"); Show(x.u); Outdent(); } void DumpEvaluateExpr::Show(const evaluate::Substring &x) { Indent("substring"); Show(x.parent()); Show(x.lower()); Show(x.upper()); Outdent(); } void DumpEvaluateExpr::Show(const ParamValue &x) { Indent("param value"); Show(x.GetExplicit()); Outdent(); } void DumpEvaluateExpr::Show( const DerivedTypeSpec::ParameterMapType::value_type &x) { Show(x.second); } void DumpEvaluateExpr::Show(const DerivedTypeSpec &x) { Indent("derived type spec"); for (auto &v : x.parameters()) { Show(v); } Outdent(); } void DumpEvaluateExpr::Show( const evaluate::StructureConstructorValues::value_type &x) { Show(x.second); } void DumpEvaluateExpr::Show(const evaluate::StructureConstructor &x) { Indent("structure constructor"); Show(x.derivedTypeSpec()); for (auto &v : x) { Show(v); } Outdent(); } void DumpEvaluateExpr::Show(const evaluate::Relational &x) { Indent("relational some type"); Show(x.u); Outdent(); } void DumpEvaluateExpr::Show(const evaluate::ComplexPart &x) { Indent("complex part"); Show(x.complex()); Outdent(); } void DumpEvaluateExpr::Show(const evaluate::ActualArgument &x) { Indent("actual argument"); if (const auto *symbol{x.GetAssumedTypeDummy()}) { Show(*symbol); } else { Show(x.UnwrapExpr()); } Outdent(); } void DumpEvaluateExpr::Show(const 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 DumpEvaluateExpr::Show(const evaluate::SpecificIntrinsic &) { Print("specific intrinsic"); } void DumpEvaluateExpr::Show(const evaluate::DescriptorInquiry &x) { Indent("descriptor inquiry"); Show(x.base()); Outdent(); } void DumpEvaluateExpr::Print(llvm::Twine twine) { outs_ << GetIndentString() << twine << '\n'; } void DumpEvaluateExpr::Indent(llvm::StringRef s) { Print(s + " {"); level_++; } void DumpEvaluateExpr::Outdent() { if (level_) { level_--; } Print("}"); } //===----------------------------------------------------------------------===// // Boilerplate entry points that the debugger can find. //===----------------------------------------------------------------------===// void DumpEvExpr(const SomeExpr &x) { DumpEvaluateExpr::Dump(x); } void DumpEvExpr( const evaluate::Expr> &x) { DumpEvaluateExpr::Dump(x); } void DumpEvExpr( const evaluate::Expr> &x) { DumpEvaluateExpr::Dump(x); } void DumpEvExpr(const evaluate::ArrayRef &x) { DumpEvaluateExpr::Dump(x); } void DumpEvExpr(const evaluate::DataRef &x) { DumpEvaluateExpr::Dump(x); } void DumpEvExpr(const evaluate::Substring &x) { DumpEvaluateExpr::Dump(x); } void DumpEvExpr( const evaluate::Designator> &x) { DumpEvaluateExpr::Dump(x); } } // namespace Fortran::semantics