[PATCH] D83183: [clang] Rework how and when APValues are dumped

Bruno Ricci via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Jul 5 15:28:35 PDT 2020


riccibruno created this revision.
riccibruno added reviewers: aaron.ballman, steveire, ilya-biryukov, sammccall, martong.
riccibruno added a project: clang.
Herald added subscribers: cfe-commits, rnkovacs.

Currently `APValue`s are dumped as a single string. This becomes quickly completely
unreadable since `APValue` is a tree-like structure. Even a simple example is not pretty:

  struct S { int arr[4]; float f; };
  constexpr S s = { .arr = {1,2}, .f = 3.1415f };
  // Struct  fields: Array: Int: 1, Int: 2, 2 x Int: 0, Float: 3.141500e+00

With this patch this becomes:

  -Struct
   |-field: Array size=4
   | |-elements: Int 1, Int 2
   | `-filler: 2 x Int 0
   `-field: Float 3.141500e+00

Additionally `APValue`s are currently only dumped as part of visiting a `ConstantExpr`.
This patch also dump the value of the initializer (if any) of constexpr variable declarations:

  constexpr int foo(int a, int b) { return a + b - 42; }
  constexpr int a = 1, b = 2;
  constexpr int c = foo(a, b) > 0 ? foo(a, b) : foo(b, a);
  // VarDecl 0x62100008aec8 <col:3, col:57> col:17 c 'const int' constexpr cinit
  // |-value: Int -39
  // `-ConditionalOperator 0x62100008b4d0 <col:21, col:57> 'int'
  // <snip>

Do the above by moving the dump functions to `TextNodeDumper` which already has
the machinery to display trees. The cases `APValue::LValue`, `APValue::MemberPointer`
and `APValue::AddrLabelDiff` are left as they were before (unimplemented).

We try to display multiple elements on the same line if they are considered to be "simple".
This is to avoid wasting large amounts of vertical space in an example like:

  constexpr int arr[8] = {0,1,2,3,4,5,6,7};
  // VarDecl 0x62100008bb78 <col:3, col:42> col:17 arr 'int const[8]' constexpr cinit
  // |-value: Array size=8
  // | |-elements: Int 0, Int 1, Int 2, Int 3
  // | `-elements: Int 4, Int 5, Int 6, Int 7


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D83183

Files:
  clang/include/clang/AST/APValue.h
  clang/include/clang/AST/ASTNodeTraverser.h
  clang/include/clang/AST/JSONNodeDumper.h
  clang/include/clang/AST/TextNodeDumper.h
  clang/lib/AST/APValue.cpp
  clang/lib/AST/ASTDumper.cpp
  clang/lib/AST/JSONNodeDumper.cpp
  clang/lib/AST/TextNodeDumper.cpp
  clang/test/AST/alignas_maybe_odr_cleanup.cpp
  clang/test/AST/ast-dump-APValue-anon-union.cpp
  clang/test/AST/ast-dump-APValue-arithmetic.cpp
  clang/test/AST/ast-dump-APValue-array.cpp
  clang/test/AST/ast-dump-APValue-struct.cpp
  clang/test/AST/ast-dump-APValue-todo.cpp
  clang/test/AST/ast-dump-APValue-union.cpp
  clang/test/AST/ast-dump-APValue-vector.cpp
  clang/test/AST/ast-dump-attr.cpp
  clang/test/AST/ast-dump-color.cpp
  clang/test/AST/ast-dump-constant-expr.cpp
  clang/test/AST/ast-dump-decl.cpp
  clang/test/AST/ast-dump-records.cpp
  clang/test/AST/ast-dump-stmt.cpp
  clang/test/AST/pr43983.cpp
  clang/test/Import/switch-stmt/test.cpp
  clang/test/Tooling/clang-check-ast-dump.cpp

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83183.275575.patch
Type: text/x-patch
Size: 65060 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200705/1fe24d58/attachment-0001.bin>


More information about the cfe-commits mailing list