-
Notifications
You must be signed in to change notification settings - Fork 14k
[flang] Show types in DumpEvExpr #143743
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
[flang] Show types in DumpEvExpr #143743
Conversation
When dumping evaluate::Expr, show type information which contains 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 { expr { expr { ... ```
@llvm/pr-subscribers-flang-semantics Author: Krzysztof Parzyszek (kparzysz) ChangesWhen dumping evaluate::Expr, show type names which contain a lot of useful information. For example show
instead of
Full diff: https://github.com/llvm/llvm-project/pull/143743.diff 2 Files Affected:
diff --git a/flang/include/flang/Semantics/dump-expr.h b/flang/include/flang/Semantics/dump-expr.h
index 2f445429a10b5..3a6a313546bb5 100644
--- a/flang/include/flang/Semantics/dump-expr.h
+++ b/flang/include/flang/Semantics/dump-expr.h
@@ -16,6 +16,7 @@
#include <memory>
#include <optional>
+#include <string>
#include <variant>
#include <vector>
@@ -38,6 +39,29 @@ class DumpEvaluateExpr {
}
private:
+ template <typename T>
+ struct TypeOf {
+ static constexpr std::string_view name{TypeOf<T>::get()};
+ static constexpr std::string_view get() {
+ std::string_view v(__PRETTY_FUNCTION__);
+ // Extract the "xyz" from the "pretty function" string:
+ // "... [with T = xyz; std::string_view = ...]"
+ std::string_view front("with T = ");
+ std::string_view back("; std::string_view =");
+
+ if (auto fpos{v.find(front)}; fpos != v.npos) {
+ // Strip the part "... [with T = "
+ v.remove_prefix(fpos + front.size());
+ if (auto bpos{v.find(back)}; bpos != v.npos) {
+ // Strip the ending "; std::string_view = ...]"
+ v.remove_suffix(v.size() - bpos);
+ return v;
+ }
+ }
+ return "";
+ }
+ };
+
template <typename A, bool C> void Show(const common::Indirection<A, C> &x) {
Show(x.value());
}
@@ -76,7 +100,7 @@ class DumpEvaluateExpr {
void Show(const evaluate::NullPointer &);
template <typename T> void Show(const evaluate::Constant<T> &x) {
if constexpr (T::category == common::TypeCategory::Derived) {
- Indent("derived constant");
+ Indent("derived constant "s + std::string(TypeOf<T>::name));
for (const auto &map : x.values()) {
for (const auto &pair : map) {
Show(pair.second.value());
@@ -84,7 +108,7 @@ class DumpEvaluateExpr {
}
Outdent();
} else {
- Print("constant");
+ Print("constant "s + std::string(TypeOf<T>::name));
}
}
void Show(const Symbol &symbol);
@@ -102,7 +126,7 @@ class DumpEvaluateExpr {
void Show(const evaluate::Substring &x);
void Show(const evaluate::ComplexPart &x);
template <typename T> void Show(const evaluate::Designator<T> &x) {
- Indent("designator");
+ Indent("designator "s + std::string(TypeOf<T>::name));
Show(x.u);
Outdent();
}
@@ -117,7 +141,7 @@ class DumpEvaluateExpr {
Outdent();
}
template <typename T> void Show(const evaluate::FunctionRef<T> &x) {
- Indent("function ref");
+ Indent("function ref "s + std::string(TypeOf<T>::name));
Show(x.proc());
Show(x.arguments());
Outdent();
@@ -127,14 +151,14 @@ class DumpEvaluateExpr {
}
template <typename T>
void Show(const evaluate::ArrayConstructorValues<T> &x) {
- Indent("array constructor value");
+ Indent("array constructor value "s + std::string(TypeOf<T>::name));
for (auto &v : x) {
Show(v);
}
Outdent();
}
template <typename T> void Show(const evaluate::ImpliedDo<T> &x) {
- Indent("implied do");
+ Indent("implied do "s + std::string(TypeOf<T>::name));
Show(x.lower());
Show(x.upper());
Show(x.stride());
@@ -148,20 +172,20 @@ class DumpEvaluateExpr {
void Show(const evaluate::StructureConstructor &x);
template <typename D, typename R, typename O>
void Show(const evaluate::Operation<D, R, O> &op) {
- Indent("unary op");
+ Indent("unary op "s + std::string(TypeOf<D>::name));
Show(op.left());
Outdent();
}
template <typename D, typename R, typename LO, typename RO>
void Show(const evaluate::Operation<D, R, LO, RO> &op) {
- Indent("binary op");
+ Indent("binary op "s + std::string(TypeOf<D>::name));
Show(op.left());
Show(op.right());
Outdent();
}
void Show(const evaluate::Relational<evaluate::SomeType> &x);
template <typename T> void Show(const evaluate::Expr<T> &x) {
- Indent("expr T");
+ Indent("expr <" + std::string(TypeOf<T>::name) + ">");
Show(x.u);
Outdent();
}
diff --git a/flang/lib/Semantics/dump-expr.cpp b/flang/lib/Semantics/dump-expr.cpp
index aa0b4e0f03398..66cedab94bfb4 100644
--- a/flang/lib/Semantics/dump-expr.cpp
+++ b/flang/lib/Semantics/dump-expr.cpp
@@ -151,7 +151,7 @@ void DumpEvaluateExpr::Show(const evaluate::StructureConstructor &x) {
}
void DumpEvaluateExpr::Show(const evaluate::Relational<evaluate::SomeType> &x) {
- Indent("expr some type");
+ Indent("relational some type");
Show(x.u);
Outdent();
}
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
return ""; | ||
#endif | ||
|
||
if (auto fpos{v.find(front)}; fpos != v.npos) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it not an issue for the #else
case to contain code referencing variables that were not defined even if that is after the return "";
statement?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That is fixed now.
When dumping evaluate::Expr, show type names which contain a lot of useful information.
For example show
instead of