Krzysztof Parzyszek 4084ffcf1e
[flang] Show types in DumpEvExpr (#143743)
When dumping evaluate::Expr, show type names which contain a lot of
useful information.

For example show
```
expr <Fortran::evaluate::SomeType> {
  expr <Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Integer>> {
    expr <Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> {
      ...
```
instead of
```
expr T {
  expr T {
    expr T {
      ...
```
2025-06-18 11:31:03 -05:00

242 lines
5.8 KiB
C++

//===-- 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<AssocEntityDetails>()}) {
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<evaluate::SomeType> &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<evaluate::Type<common::TypeCategory::Integer, 4>> &x) {
DumpEvaluateExpr::Dump(x);
}
void DumpEvExpr(
const evaluate::Expr<evaluate::Type<common::TypeCategory::Integer, 8>> &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<evaluate::Type<common::TypeCategory::Integer, 4>>
&x) {
DumpEvaluateExpr::Dump(x);
}
} // namespace Fortran::semantics