[[PATCH V9] 4/7] CTF/BTF testsuites

Richard Biener richard.guenther@gmail.com
Mon Jun 21 14:02:39 GMT 2021


On Mon, May 31, 2021 at 7:20 PM Jose E. Marchesi via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> This commit adds a new testsuite for the CTF debug format.

OK if the rest is approved - while I'm not too familiar with dejagnu I think
we can deal with fallout after the fact.

Richard.

> 2021-05-14  Indu Bhagat  <indu.bhagat@oracle.com>
>             David Faust  <david.faust@oracle.com>
>
> gcc/testsuite/
>
>         * lib/gcc-dg.exp (gcc-dg-frontend-supports-ctf): New procedure.
>         (gcc-dg-debug-runtest): Add -gctf support.
>         * gcc.dg/debug/btf/btf-1.c: New test.
>         * gcc.dg/debug/btf/btf-2.c: Likewise.
>         * gcc.dg/debug/btf/btf-anonymous-struct-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-anonymous-union-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-array-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-bitfields-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-bitfields-2.c: Likewise.
>         * gcc.dg/debug/btf/btf-bitfields-3.c: Likewise.
>         * gcc.dg/debug/btf/btf-cvr-quals-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-enum-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-forward-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-function-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-function-2.c: Likewise.
>         * gcc.dg/debug/btf/btf-int-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-pointers-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-struct-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-typedef-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-union-1.c: Likewise.
>         * gcc.dg/debug/btf/btf-variables-1.c: Likewise.
>         * gcc.dg/debug/btf/btf.exp: Likewise.
>         * gcc.dg/debug/ctf/ctf-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-anonymous-struct-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-anonymous-union-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-array-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-array-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-array-3.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-array-4.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-attr-mode-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-attr-used-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-bitfields-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-bitfields-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-bitfields-3.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-bitfields-4.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-complex-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-cvr-quals-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-cvr-quals-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-cvr-quals-3.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-cvr-quals-4.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-enum-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-enum-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-file-scope-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-float-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-forward-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-forward-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-func-index-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-function-pointers-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-function-pointers-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-function-pointers-3.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-functions-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-int-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-objt-index-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-pointers-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-pointers-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-preamble-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-skip-types-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-skip-types-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-skip-types-3.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-skip-types-4.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-skip-types-5.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-skip-types-6.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-str-table-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-struct-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-struct-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-struct-array-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-struct-pointer-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-struct-pointer-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-typedef-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-typedef-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-typedef-3.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-typedef-struct-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-typedef-struct-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-typedef-struct-3.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-union-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-variables-1.c: Likewise.
>         * gcc.dg/debug/ctf/ctf-variables-2.c: Likewise.
>         * gcc.dg/debug/ctf/ctf.exp: Likewise.
> ---
>  gcc/testsuite/gcc.dg/debug/btf/btf-1.c        |  6 ++
>  gcc/testsuite/gcc.dg/debug/btf/btf-2.c        | 10 +++
>  .../gcc.dg/debug/btf/btf-anonymous-struct-1.c | 23 ++++++
>  .../gcc.dg/debug/btf/btf-anonymous-union-1.c  | 23 ++++++
>  gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c  | 31 +++++++
>  .../gcc.dg/debug/btf/btf-bitfields-1.c        | 34 ++++++++
>  .../gcc.dg/debug/btf/btf-bitfields-2.c        | 26 ++++++
>  .../gcc.dg/debug/btf/btf-bitfields-3.c        | 43 ++++++++++
>  .../gcc.dg/debug/btf/btf-bitfields-4.c        | 23 ++++++
>  .../gcc.dg/debug/btf/btf-cvr-quals-1.c        | 52 ++++++++++++
>  .../gcc.dg/debug/btf/btf-datasec-1.c          | 45 ++++++++++
>  gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c   | 30 +++++++
>  .../gcc.dg/debug/btf/btf-forward-1.c          | 24 ++++++
>  .../gcc.dg/debug/btf/btf-function-1.c         | 18 ++++
>  .../gcc.dg/debug/btf/btf-function-2.c         | 18 ++++
>  .../gcc.dg/debug/btf/btf-function-3.c         | 22 +++++
>  gcc/testsuite/gcc.dg/debug/btf/btf-int-1.c    | 44 ++++++++++
>  .../gcc.dg/debug/btf/btf-pointers-1.c         | 25 ++++++
>  .../gcc.dg/debug/btf/btf-pointers-2.c         | 13 +++
>  gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c | 22 +++++
>  gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c | 19 +++++
>  .../gcc.dg/debug/btf/btf-typedef-1.c          | 82 +++++++++++++++++++
>  gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c  | 16 ++++
>  .../gcc.dg/debug/btf/btf-variables-1.c        | 33 ++++++++
>  .../gcc.dg/debug/btf/btf-variables-2.c        | 27 ++++++
>  .../gcc.dg/debug/btf/btf-variables-3.c        | 36 ++++++++
>  gcc/testsuite/gcc.dg/debug/btf/btf.exp        | 41 ++++++++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-1.c        |  6 ++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-2.c        | 10 +++
>  .../gcc.dg/debug/ctf/ctf-anonymous-struct-1.c | 23 ++++++
>  .../gcc.dg/debug/ctf/ctf-anonymous-union-1.c  | 26 ++++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-array-1.c  | 31 +++++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-array-2.c  | 38 +++++++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-array-3.c  | 17 ++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-array-4.c  | 13 +++
>  .../gcc.dg/debug/ctf/ctf-attr-mode-1.c        | 22 +++++
>  .../gcc.dg/debug/ctf/ctf-attr-used-1.c        | 22 +++++
>  .../gcc.dg/debug/ctf/ctf-bitfields-1.c        | 30 +++++++
>  .../gcc.dg/debug/ctf/ctf-bitfields-2.c        | 39 +++++++++
>  .../gcc.dg/debug/ctf/ctf-bitfields-3.c        | 16 ++++
>  .../gcc.dg/debug/ctf/ctf-bitfields-4.c        | 19 +++++
>  .../gcc.dg/debug/ctf/ctf-complex-1.c          | 21 +++++
>  .../gcc.dg/debug/ctf/ctf-cvr-quals-1.c        | 65 +++++++++++++++
>  .../gcc.dg/debug/ctf/ctf-cvr-quals-2.c        | 30 +++++++
>  .../gcc.dg/debug/ctf/ctf-cvr-quals-3.c        | 25 ++++++
>  .../gcc.dg/debug/ctf/ctf-cvr-quals-4.c        | 23 ++++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-debug-1.c  |  7 ++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-debug-2.c  |  7 ++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-enum-1.c   | 21 +++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-enum-2.c   | 27 ++++++
>  .../gcc.dg/debug/ctf/ctf-file-scope-1.c       | 25 ++++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-float-1.c  | 16 ++++
>  .../gcc.dg/debug/ctf/ctf-forward-1.c          | 40 +++++++++
>  .../gcc.dg/debug/ctf/ctf-forward-2.c          | 16 ++++
>  .../gcc.dg/debug/ctf/ctf-func-index-1.c       | 25 ++++++
>  .../debug/ctf/ctf-function-pointers-1.c       | 24 ++++++
>  .../debug/ctf/ctf-function-pointers-2.c       | 22 +++++
>  .../debug/ctf/ctf-function-pointers-3.c       | 21 +++++
>  .../debug/ctf/ctf-function-pointers-4.c       | 18 ++++
>  .../gcc.dg/debug/ctf/ctf-functions-1.c        | 34 ++++++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-int-1.c    | 17 ++++
>  .../gcc.dg/debug/ctf/ctf-objt-index-1.c       | 30 +++++++
>  .../gcc.dg/debug/ctf/ctf-pointers-1.c         | 26 ++++++
>  .../gcc.dg/debug/ctf/ctf-pointers-2.c         | 25 ++++++
>  .../gcc.dg/debug/ctf/ctf-preamble-1.c         | 11 +++
>  .../gcc.dg/debug/ctf/ctf-skip-types-1.c       | 38 +++++++++
>  .../gcc.dg/debug/ctf/ctf-skip-types-2.c       | 17 ++++
>  .../gcc.dg/debug/ctf/ctf-skip-types-3.c       | 20 +++++
>  .../gcc.dg/debug/ctf/ctf-skip-types-4.c       | 19 +++++
>  .../gcc.dg/debug/ctf/ctf-skip-types-5.c       | 19 +++++
>  .../gcc.dg/debug/ctf/ctf-skip-types-6.c       | 18 ++++
>  .../gcc.dg/debug/ctf/ctf-skip-types-7.c       | 18 ++++
>  .../gcc.dg/debug/ctf/ctf-skip-types-8.c       | 27 ++++++
>  .../gcc.dg/debug/ctf/ctf-str-table-1.c        | 26 ++++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-1.c | 25 ++++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-2.c | 32 ++++++++
>  .../gcc.dg/debug/ctf/ctf-struct-array-1.c     | 65 +++++++++++++++
>  .../gcc.dg/debug/ctf/ctf-struct-array-2.c     | 15 ++++
>  .../gcc.dg/debug/ctf/ctf-struct-pointer-1.c   | 21 +++++
>  .../gcc.dg/debug/ctf/ctf-struct-pointer-2.c   | 22 +++++
>  .../gcc.dg/debug/ctf/ctf-typedef-1.c          | 68 +++++++++++++++
>  .../gcc.dg/debug/ctf/ctf-typedef-2.c          | 20 +++++
>  .../gcc.dg/debug/ctf/ctf-typedef-3.c          | 24 ++++++
>  .../gcc.dg/debug/ctf/ctf-typedef-struct-1.c   | 14 ++++
>  .../gcc.dg/debug/ctf/ctf-typedef-struct-2.c   | 17 ++++
>  .../gcc.dg/debug/ctf/ctf-typedef-struct-3.c   | 32 ++++++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf-union-1.c  | 14 ++++
>  .../gcc.dg/debug/ctf/ctf-variables-1.c        | 25 ++++++
>  .../gcc.dg/debug/ctf/ctf-variables-2.c        | 16 ++++
>  gcc/testsuite/gcc.dg/debug/ctf/ctf.exp        | 41 ++++++++++
>  gcc/testsuite/lib/gcc-dg.exp                  | 64 +++++++++++----
>  91 files changed, 2376 insertions(+), 15 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-4.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-cvr-quals-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-datasec-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-forward-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-int-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-pointers-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-variables-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf.exp
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-anonymous-struct-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-anonymous-union-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-array-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-array-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-array-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-array-4.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-attr-mode-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-attr-used-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-4.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-complex-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-4.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-debug-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-debug-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-enum-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-enum-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-file-scope-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-float-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-forward-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-forward-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-func-index-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-4.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-functions-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-int-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-objt-index-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-pointers-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-pointers-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-preamble-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-4.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-5.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-6.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-7.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-8.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-str-table-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-array-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-array-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-pointer-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-pointer-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-union-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-variables-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-variables-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf.exp
>
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-1.c
> new file mode 100644
> index 00000000000..bcbc9492439
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-1.c
> @@ -0,0 +1,6 @@
> +/* { dg-do compile } */
> +/* { dg-options "-gbtf" } */
> +
> +void func(void)
> +{
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-2.c
> new file mode 100644
> index 00000000000..70e2ff1e053
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-2.c
> @@ -0,0 +1,10 @@
> +/* Check the BTF header information.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "0xeb9f.*btf_magic" 1} } */
> +/* { dg-final { scan-assembler-times "0x1.*btf_version" 1 } } */
> +/* { dg-final { scan-assembler-times "0.*btf_flags" 1 } } */
> +
> +int foo;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
> new file mode 100644
> index 00000000000..89a5701bba0
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
> @@ -0,0 +1,23 @@
> +/* Test BTF generation of anonymous struct.
> +
> +   We expect two BTF struct records:
> +   - struct foo, with two fields "a" and "bar"
> +   - struct <anonymous> with one field "b"
> +
> +   The anonymous struct should have a name of 0, pointing to the null string
> +   at the start of the string table.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* Struct type with 2 members (struct foo).  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* Struct type with 1 member (anon struct).  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x4000001\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*btt_name" 1 } } */
> +
> +struct foo
> +{
> +  int a;
> +  struct { int b; } bar;
> +} myfoo;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
> new file mode 100644
> index 00000000000..f3b120bb458
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
> @@ -0,0 +1,23 @@
> +/* Test BTF generation of anonymous union.
> +
> +   We expect a named struct type and an anonymous union type record to
> +   be generated. The anonymous union record should have a name of 0,
> +   pointing to the null string at the start of the string table.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* Struct type with 1 member.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x4000001\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* Union type with 2 members.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x5000002\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*btt_name" 1 } } */
> +
> +struct foo
> +{
> +  union
> +    {
> +      int value;
> +      char ascii;
> +    };
> +} myfoo;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
> new file mode 100644
> index 00000000000..ab55445bd35
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
> @@ -0,0 +1,31 @@
> +/* BTF generation for array type.
> +
> +   Unsized arrays are encoded with a 0 for the number of elements.
> +
> +   In this testcase, 5 distinct BTF records for arrays are expected
> +   b1 : cta_nelems = 2
> +   c1 : cta_nelems = 3
> +   a1 : cta_nelems = 2, 5
> +   buf : cta_nelems = 0.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "0x3000000\[\t \]+\[^\n\]*btt_info" 5 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*bta_nelems" 2 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x3\[\t \]+\[^\n\]*bta_nelems" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x5\[\t \]+\[^\n\]*bta_nelems" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*bta_nelems" 1 } } */
> +
> +int b1[2] = {0,1};
> +int c1[5] = {0,1,2,3,4};
> +int a1[2][3] = { {3,4,5}, {2,3,4} };
> +
> +/* Variable length struct using arrays.  */
> +struct my_array
> +{
> +  int flags;
> +  int length;
> +  int buf[];
> +} my_array_obj;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-1.c
> new file mode 100644
> index 00000000000..c6bf52130dc
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-1.c
> @@ -0,0 +1,34 @@
> +/* Basic tests for BTF bitfields.
> +
> +   The structure containing bitfield members should be marked with KIND_FLAG=1
> +   The bitfield member offsets should be encoded as:
> +     (bit_size << 24) | bit_offset
> +     - (0xa  << 24) | 0x20
> +     - (0x7  << 24) | 0x2a
> +     - (0x13 << 24) | 0x40 - note that this is aligned to 0x40.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x84000004\[\t \]+\[^\n\]*btt_info" 1 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0xa000020\[\t \]+\[^\n\]*btm_offset" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x700002a\[\t \]+\[^\n\]*btm_offset" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x13000040\[\t \]+\[^\n\]*btm_offset" 1 } } */
> +
> +struct bitt {
> +  int a;
> +  unsigned int bitfield_a : 10;
> +  unsigned int bitfield_b : 7;
> +  unsigned int bitfield_c : 19;
> +} bitty;
> +
> +struct no_bitt {
> +  int a;
> +  int b;
> +} no_bitty;
> +
> +int main ()
> +{
> +  return bitty.bitfield_b + bitty.a;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
> new file mode 100644
> index 00000000000..9665ab67145
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
> @@ -0,0 +1,26 @@
> +/* Test BTF generation for struct with 0 size bitfield.
> +
> +   We expect a struct with 2 members to be generated. The size 0 bitfield
> +   should not have any entry in the member list.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* Struct with bitfield members, and 2 members.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x84000002\[\t \]+\[^\n\]*btt_info" 1 } } */
> +
> +/* Bitfield size 31 (0x1f) at offset 0.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x1f000000\[\t \]+\[^\n\]*btm_offset" 1 } } */
> +
> +/* Bitfield size 32 (0x20) at offset 32.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x20000020\[\t \]+\[^\n\]*btm_offset" 1 } } */
> +
> +/* Only 2 members.  */
> +/* { dg-final { scan-assembler-times "btm_name" 2 } } */
> +
> +struct foo
> +{
> +  unsigned a : 31;
> +  unsigned   : 0;
> +  unsigned c : 32;
> +} myfoo;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
> new file mode 100644
> index 00000000000..440623c3b16
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
> @@ -0,0 +1,43 @@
> +/* Test BTF generation for enum-type bitfields
> +
> +   It is allowed to have a bitfield type be an enum type.
> +   We expect the following types:
> +
> +     [1] enum 'foo'(1U#B) size=4U#B
> +        'BAR' value=0
> +        'BAZ' value=1
> +        'QUZ' value=2
> +        'QUX' value=3
> +     [2] int 'unsigned int' size=4 offset=0 bits=32
> +     [3] struct 'bitt' size=4
> +         member 'f' type=1 bitfield_size=2 bit_offset=0
> +         member 'data' type=2 bitfield_size=14 bit_offset=2
> +   */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* Enum with 4 members.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x6000004\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* Struct with bitfield members, and 2 members.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x84000002\[\t \]+\[^\n\]*btt_info" 1 } } */
> +
> +/* Bitfield "f" points to type ID 1.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x1\[\t \]+\[^\n\]*btm_type" 1 } } */
> +
> +/* Bitfield "data" points to type ID 2.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*btm_type" 1 } } */
> +
> +enum foo
> +{
> +  BAR = 0,
> +  BAZ = 1,
> +  QUZ = 2,
> +  QUX = 3
> +};
> +
> +struct bitt
> +{
> +  enum foo f : 2;
> +  unsigned data : 14;
> +} bitty;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-4.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-4.c
> new file mode 100644
> index 00000000000..af91845726f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-4.c
> @@ -0,0 +1,23 @@
> +/* Test BTF generation for non-representable bitfields.
> +
> +   Due to the limitations of BTF, we only have 24 bits in which to store
> +   the bitfield offset (in bits, from the beginning of the struct).
> +
> +   In this test, we construct a structure such that the bitfield will have
> +   an offset so large as to be unrepresentable in BTF. We expect that the
> +   resulting BTF will describe the rest of the structure, ignoring the
> +   non-representable bitfield.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* Struct with 3 members and no bitfield (kind_flag not set).  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x4000003\[\t \]+\[^\n\]*btt_info" 1 } } */
> +
> +struct bigly
> +{
> +  int a;
> +  int b[((0xffffff + 1) / (8 * sizeof (int)))];
> +  unsigned unsup : 7;
> +  char c;
> +} big;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-cvr-quals-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-cvr-quals-1.c
> new file mode 100644
> index 00000000000..79e9f52a479
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-cvr-quals-1.c
> @@ -0,0 +1,52 @@
> +/* Test BTF generation of BTF_KIND_{CONST,VOLATILE,RESTRICT} records.
> +
> +   BTF const, volatile and restrict records are nameless type records pointing
> +   to the type they modify.
> +
> +   Types:
> +     [1] int 'int' size=4U offset=0 bits=32 SIGNED
> +     [2] const <anonymous> type=1
> +     [3] volatile <anonymous> type=1
> +     [4] const <anonymous> type=3
> +     [5] ptr <anonymous> type=1
> +     [6] restrict <anonymous> type=5
> +     [7] ptr <anonymous> type=2
> +     [8] restrict <anonymous> type=7
> +
> +   Note:
> +   - Type id 3 describes a volatile int.
> +   - Type id 2 describes a const int.
> +   - Type id 4 describes a const volatile int by modifying id 3.
> +   - Type id 6 describes a restrict pointer to int.
> +   - Type id 8 describes a restrict pointer to const int.
> + */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +
> +/* types 5 and 7 are pointers, to 'int' and 'const int' respectively.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x2000000\[\t \]+\[^\n\]*btt_info" 2 } } */
> +
> +/* type 3 has VOLATILE qualifier */
> +/* { dg-final { scan-assembler-times "\[\t \]0x9000000\[\t \]+\[^\n\]*btt_info" 1 } } */
> +
> +/* types 2 and 4 have CONST qualifier.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0xa000000\[\t \]+\[^\n\]*btt_info" 2 } } */
> +
> +/* types 6 and 8 have RESTRICT qualifier.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0xb000000\[\t \]+\[^\n\]*btt_info" 2 } } */
> +
> +const int a = 10;
> +
> +volatile int b;
> +
> +int * restrict c;
> +
> +const volatile int d = 20;
> +
> +const int * restrict e;
> +
> +const int * f;
> +int const * g;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-1.c
> new file mode 100644
> index 00000000000..88ae4c4edfd
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-1.c
> @@ -0,0 +1,45 @@
> +/* BTF generation of BTF_KIND_DATASEC records.
> +
> +   We expect 3 DATASEC records: one for each of .data, .rodata and .bss.
> +   .rodata: the consts; c,e,my_cstruct
> +   .bss:    a,b,bigarr
> +   .data:   d
> +
> +   The type IDs of the variables placed in each section are not deterministic
> +   so we cannot check them.
> + */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* Check for two DATASEC entries with vlen 3, and one with vlen 1.  */
> +/* { dg-final { scan-assembler-times "0xf000003\[\t \]+\[^\n\]*btt_info" 2 } } */
> +/* { dg-final { scan-assembler-times "0xf000001\[\t \]+\[^\n\]*btt_info" 1 } } */
> +
> +/* The offset entry for each variable in a DATSEC should be 0 at compile time.  */
> +/* { dg-final { scan-assembler-times "0\[\t \]+\[^\n\]*bts_offset" 7 } } */
> +
> +/* Check that strings for each DATASEC have been added to the BTF string table.  */
> +/* { dg-final { scan-assembler-times "ascii \".data.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \".rodata.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \".bss.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */
> +
> +int a;
> +long long b;
> +const long unsigned int c;
> +
> +int d = 137;
> +
> +const int e = -55;
> +
> +int bigarr[20][10];
> +
> +struct c_struct {
> +  long x;
> +  char c;
> +};
> +
> +const struct c_struct my_cstruct = {
> +  99,
> +  '?'
> +};
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c
> new file mode 100644
> index 00000000000..728493b0804
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c
> @@ -0,0 +1,30 @@
> +/* Test BTF generation for enums.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x6000004\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x6000003\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"QAD.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"QED.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"QOD.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"QUD.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"YES.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"NO.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"IDUNNO.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "bte_value" 7 } } */
> +
> +enum foo
> +{
> +  QAD,
> +  QED,
> +  QOD,
> +  QUD,
> +} a;
> +
> +enum barsigned
> +{
> +  YES=1000,
> +  NO=-1000,
> +  IDUNNO=0,
> +} b;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-forward-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-forward-1.c
> new file mode 100644
> index 00000000000..c894fa26bc7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-forward-1.c
> @@ -0,0 +1,24 @@
> +/* Test BTF generation of forwards.
> +
> +   Check that the KIND_FLAG (bit 31) of btt_info is set (1) for the forward to
> +   union, and not set (0) for forward to struct.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x87000000\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x7000000\[\t \]+\[^\n\]*btt_info" 1 } } */
> +
> +typedef struct _fwd_st
> +{
> +  struct unk_struct_type *data[4];
> +} fwd_st_t;
> +
> +fwd_st_t struct_container;
> +
> +typedef struct _fwd_un
> +{
> +  union unk_union_type *options[4];
> +} fwd_un_t;
> +
> +fwd_un_t union_container;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-1.c
> new file mode 100644
> index 00000000000..9fa1498bd8e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-1.c
> @@ -0,0 +1,18 @@
> +/* Test BTF generation for functions.
> +
> +   We expect to see one BTF_KIND_FUNC_PROTO with 2 named arguments.
> +   The parameter names should appear in the auxilliary string table.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0xd000002\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "farg_name" 2 } } */
> +/* { dg-final { scan-assembler-times "farg_type" 2 } } */
> +/* { dg-final { scan-assembler-times "ascii \"alpha.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"bravo.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */
> +
> +int funfoo (int alpha, long bravo)
> +{
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-2.c
> new file mode 100644
> index 00000000000..3c7fda9ee35
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-2.c
> @@ -0,0 +1,18 @@
> +/* Test BTF generation for functions with varargs.
> +
> +   We expect one BTF_KIND_FUNC_PROTO with two arguments. The second argument
> +   should have "farg_name" and "farg_type" both of 0, representing varargs.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0xd000002\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "farg_name" 2 } } */
> +/* { dg-final { scan-assembler-times "farg_type" 2 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*farg_name" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*farg_type" 1 } } */
> +
> +int fmt (const char * format, ...)
> +{
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
> new file mode 100644
> index 00000000000..35f96a2152c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
> @@ -0,0 +1,22 @@
> +/* Test BTF generation for a function with an unrepresentable parameter.
> +
> +   BTF has no encoding for floating point types, among others. Function
> +   parameters of unrepresentable types are emitted as 'void' types.
> +
> +   We expect one BTF_KIND_FUNC_PROTO with 3 parameters, one of which
> +   has type_id=0.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0xd000003\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "farg_name" 3 } } */
> +/* { dg-final { scan-assembler-times "farg_type" 3 } } */
> +
> +/* Exactly one function parameter should have type_id=0.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*farg_type" 1 } } */
> +
> +int foo (int a, float f, long b)
> +{
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-int-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-int-1.c
> new file mode 100644
> index 00000000000..2381decd6ff
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-int-1.c
> @@ -0,0 +1,44 @@
> +/* Tests for BTF integer base types.
> +
> +     0       f       ff      00   ff
> +   | 0 | encoding | offset | 00 | bits |
> +   encoding:
> +     signed  1 << 24
> +     char    2 << 24
> +
> +   All offsets in this test should be 0.
> +   This test does _not_ check number of bits, as it may vary between targets.
> + */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* Check for 8 BTF_KIND_INT types.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x1000000\[\t \]+\[^\n\]*btt_info" 8 } } */
> +
> +/* Check the signed/char flags, but not bit size. */
> +/* { dg-final { scan-assembler-times "\[\t \]0x10000..\[\t \]+\[^\n\]*bti_encoding" 3 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x20000..\[\t \]+\[^\n\]*bti_encoding" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x30000..\[\t \]+\[^\n\]*bti_encoding" 1 } } */
> +
> +/* Check that there is a string entry for each type name.  */
> +/* { dg-final { scan-assembler-times "ascii \"unsigned char.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"signed char.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"short unsigned int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"short int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"unsigned int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"long unsigned int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"long int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +
> +unsigned char a = 11;
> +signed char b = -22;
> +
> +unsigned short c = 33;
> +signed short d = 44;
> +
> +unsigned int e = 55;
> +signed int f = -66;
> +
> +unsigned long int g = 77;
> +signed long int h = 88;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
> new file mode 100644
> index 00000000000..a14ac0f89b2
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
> @@ -0,0 +1,25 @@
> +/* Test BTF generation for pointer types.
> +
> +   Two pointer types are expected:
> +    - int *
> +    - struct st *
> +   */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x2000000\[\t \]+\[^\n\]*btt_info" 2 } } */
> +/* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"st.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +
> +int foo = 10;
> +int *pfoo = &foo;
> +
> +struct st
> +{
> +  int a;
> +  int *pb;
> +  struct st * next;
> +};
> +
> +struct st * bar;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-2.c
> new file mode 100644
> index 00000000000..c77b224d711
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-2.c
> @@ -0,0 +1,13 @@
> +/* Test BTF generation for pointers to void.
> +
> +   In this test, we expect that the pointer references type ID 0, the reserved
> +   void typeid, and that no intermediate type is generated for void. */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x2000000\[\t \]+\[^\n\]*btt_info" 1 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x1000000\[\t \]+\[^\n\]*btt_info" 0 } } */
> +
> +void *ptr;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
> new file mode 100644
> index 00000000000..bc3281437c9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
> @@ -0,0 +1,22 @@
> +/* Test BTF generation of struct type.
> +
> +   Two BTF_KIND_STRUCT records are expected.
> +   - struct foo with 3 members
> +   - struct data with 2 members  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x4000003\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "btm_name" 5 } } */
> +
> +struct foo
> +{
> +  int after;
> +  int before;
> +  struct {
> +    unsigned short n_valid;
> +    int set[10];
> +  } data;
> +} my_foo;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
> new file mode 100644
> index 00000000000..24514fcb31e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
> @@ -0,0 +1,19 @@
> +/* Test BTF generation for struct type with a member which refers to an
> +   unsupported type.
> +
> +   BTF does not support floating point types (among other things). When
> +   generating BTF for a struct (or union) type, members which refer to
> +   unsupported types should be skipped.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* Expect a struct with only 2 members - 'f' should not be present.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t \]+\[^\n\]*btt_info" 1 } } */
> +
> +struct with_float
> +{
> +  int a;
> +  float f;
> +  char c;
> +} instance;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
> new file mode 100644
> index 00000000000..472cc63f600
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
> @@ -0,0 +1,82 @@
> +/* Test BTF generation for BTF_KIND_TYPEDEF records.
> +
> +   7 typedef records are expected. We expect the following types (among others):
> +     [1] int 'int' size=4 offset=0 bits=32 SIGNED
> +     [2] typedef 'my_int' type=1
> +     [3] typedef 'foo_int' type=1
> +     [4] typedef 'bar_int' type=1
> +     ..
> +     [6] typedef 'CBAR' type=5
> +     ..
> +     [8] typedef 'CBARP' type=7
> +     [9] struct '_node' size=16
> +     ..
> +     [11] typedef 'node_t' type=9
> +     [12] struct '_arena'
> +     ..
> +     [15] typedef 'arena_t' type=12
> +     [16] var 'a' type=2 linkage=1 (global)
> +     [17] var 'suitcase' type=15 linkage=1 (global)
> +     [18] var 'b' type=3 linkage=1 (global)
> +     [19] var 'c' type=4 linkage=1 (global)
> +     [20] var 'd' type=11 linkage=1 (global)
> +     [21] var 'destination' type=6 linkage=1 (global)
> +     [22] var 'ticket' type=8 linkage=1 (global)
> +
> +   Note that the order of the variables is not guaranteed, so we do not check
> +   particular variables have exactly the right typedef. Instead, we check:
> +   1. 7 typedef records are generated, along with the correct strings for them.
> +   2. There is one variable pointing to each typedef.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x8000000\[\t \]+\[^\n\]*btt_info" 7 } } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"my_int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"foo_int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"bar_int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"CBAR.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"CBARP.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"node_t.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"arena_t.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*btv_type" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x3\[\t \]+\[^\n\]*btv_type" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x4\[\t \]+\[^\n\]*btv_type" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x6\[\t \]+\[^\n\]*btv_type" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x8\[\t \]+\[^\n\]*btv_type" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0xb\[\t \]+\[^\n\]*btv_type" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0xf\[\t \]+\[^\n\]*btv_type" 1 } } */
> +
> +typedef int my_int;
> +typedef int foo_int;
> +typedef int bar_int;
> +
> +typedef const bar_int CBAR;
> +typedef const bar_int * CBARP;
> +
> +typedef struct _node
> +{
> +  foo_int name_off;
> +  bar_int info;
> +  struct _node * next;
> +} node_t;
> +
> +
> +typedef struct _arena
> +{
> +  node_t nodes[16];
> +  my_int vardata;
> +  bar_int flags;
> +} arena_t;
> +
> +my_int a;
> +foo_int b;
> +bar_int c;
> +node_t d;
> +
> +CBAR destination;
> +CBARP ticket = &destination;
> +
> +arena_t suitcase;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
> new file mode 100644
> index 00000000000..d66843717b3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
> @@ -0,0 +1,16 @@
> +/* Test BTF generation for union type.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* One union type with 4 members */
> +/* { dg-final { scan-assembler-times "\[\t \]0x5000004\[\t \]+\[^\n\]*btt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "btm_name" 4 } } */
> +
> +union onion
> +{
> +  int redness;
> +  char *name;
> +  unsigned short freshness;
> +  unsigned short flavor;
> +} my_onion;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
> new file mode 100644
> index 00000000000..a79ed1d53b7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
> @@ -0,0 +1,33 @@
> +/* BTF generation for variables. */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* We expect 6 variables */
> +/* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*btv_info" 6 } } */
> +
> +unsigned int x1;
> +
> +struct st
> +{
> +  int a;
> +  int b;
> +};
> +
> +union {
> +  long int value;
> +  struct st * pointer;
> +} bar;
> +
> +enum
> +{
> +  FOO = 0,
> +  BAR = 2,
> +  BAZ,
> +} lala;
> +
> +int arr[10][20];
> +
> +unsigned long * plong;
> +
> +struct st st_inst;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
> new file mode 100644
> index 00000000000..0f9742e9ac5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
> @@ -0,0 +1,27 @@
> +/* BTF generation for variables with removed type.
> +
> +   BTF does not support floating point types, so no representation for the type
> +   'float' will be emitted. In this test, we check to also ensure that the
> +   variable 'bar' is not emitted, as it references a type that is not supported
> +   in BTF.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* We expect only 3 variables.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*btv_info" 3 } } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"foo.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"baz.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"myst.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
> +
> +int foo;
> +float bar;
> +int baz[10];
> +
> +struct st
> +{
> +  int a;
> +  int b : 6;
> +  int c : 2;
> +} myst;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-3.c b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-3.c
> new file mode 100644
> index 00000000000..8cae22123af
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-3.c
> @@ -0,0 +1,36 @@
> +/* Test BTF generation for static versus global variables.
> +
> +   BTF_KIND_VAR types represeting variables are followed by a 32-bit
> +   "linkage", which can take one of currently two valid values:
> +      0 = static
> +      1 = global
> +
> +   In this test, make a few static and a few global variables, and ensure
> +   they are noted with the correct "linkage" values.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* Expect 6 variables.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*btv_info" 6 } } */
> +
> +/* 3 global, 3 static.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*btv_linkage" 3 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x1\[\t \]+\[^\n\]*btv_linkage" 3 } } */
> +
> +int a;
> +
> +static long b;
> +
> +struct foo {
> +  int x;
> +  int y;
> +};
> +
> +struct foo g_foo;
> +
> +static struct foo s_foo;
> +
> +static unsigned int s_arr [10][5];
> +
> +unsigned int g_arr [20];
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf.exp b/gcc/testsuite/gcc.dg/debug/btf/btf.exp
> new file mode 100644
> index 00000000000..e72a2be8516
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf.exp
> @@ -0,0 +1,41 @@
> +#   Copyright (C) 2002-2019 Free Software Foundation, Inc.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with GCC; see the file COPYING3.  If not see
> +# <http://www.gnu.org/licenses/>.
> +
> +# GCC testsuite that uses the `dg.exp' driver.
> +
> +# Load support procs.
> +load_lib gcc-dg.exp
> +
> +# Disable on ptx (in sync with DWARF testsuite)
> +if { [istarget nvptx-*-*] } {
> +    return
> +}
> +
> +# If a testcase doesn't have special options, use these.
> +global DEFAULT_CFLAGS
> +if ![info exists DEFAULT_CFLAGS] then {
> +    set DEFAULT_CFLAGS " -ansi -pedantic-errors"
> +}
> +
> +# Initialize `dg'.
> +dg-init
> +
> +# Main loop.
> +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\] ]] \
> +       "" $DEFAULT_CFLAGS
> +
> +# All done.
> +dg-finish
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-1.c
> new file mode 100644
> index 00000000000..6f637df5be8
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-1.c
> @@ -0,0 +1,6 @@
> +/* { dg-do compile } */
> +/* { dg-options "-gctf" } */
> +
> +void func(void)
> +{
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-2.c
> new file mode 100644
> index 00000000000..ccbb109cdbd
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-2.c
> @@ -0,0 +1,10 @@
> +/* A LEVEL of 0 with -gctf turns off CTF debug info generation.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-gctf0 -dA" } */
> +
> +/* { dg-final { scan-assembler-times "0xdff2.*CTF preamble magic number" 0} } */
> +/* { dg-final { scan-assembler-times "0x4.*CTF preamble version" 0 } } */
> +/* { dg-final { scan-assembler-times "0.*CTF preamble flags" 0 } } */
> +
> +const char * _CONTEXT_NAME = "foobar";
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-anonymous-struct-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-anonymous-struct-1.c
> new file mode 100644
> index 00000000000..93547d45818
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-anonymous-struct-1.c
> @@ -0,0 +1,23 @@
> +/* Test compilation and CTF generation of anonymous structs.  An anonymous
> +   struct type is encoded as no-name CTF struct type.
> +
> +   For this testcase, a single CTF anonymous struct is expected.
> +   struct {} : ctt_name = 0 (point to offset 0 in the CTF string table to
> +                           denote empty string)
> +
> +   Two CTF struct records should be generated in total.
> +   struct a : ctt_info = 0x1a000002 (2 fields)
> +   struct {} : ctt_info = 0x1a000001 (1 field)  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*ctt_name" 1 } } */
> +/* { dg-final { scan-assembler-times "0x1a000002\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "0x1a000001\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +
> +struct a
> +{
> +  struct { int b1; } a1;
> +  int a2;
> +} my_a;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-anonymous-union-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-anonymous-union-1.c
> new file mode 100644
> index 00000000000..f45af9b742d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-anonymous-union-1.c
> @@ -0,0 +1,26 @@
> +/* Test compilation and CTF generation of anonymous union.  An anonymous union
> +   is encoded as no-name CTF union type.
> +
> +   For this testcase, a single CTF anonymous union is expected.
> +   struct {} : ctt_name = 0 (point to offset 0 in the CTF string table to
> +                           denote empty string)
> +
> +   Two CTF struct records should be generated in total.
> +   struct anon_union : ctt_info = 0x1a000001 (1 field)
> +   union {} : ctt_info = 0x1e000002 (2 fields)  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*ctt_name" 1 } } */
> +/* { dg-final { scan-assembler-times "0x1a000001\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "0x1e000002\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +
> +struct anon_union
> +{
> +  union
> +    {
> +      char name;
> +      int value;
> +    };
> +} my_anon_u;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-1.c
> new file mode 100644
> index 00000000000..006a7582f0b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-1.c
> @@ -0,0 +1,31 @@
> +/* CTF generation for array type.
> +
> +   Unsized arrays are encoded with a 0 for the number of elements.
> +
> +   In this testcase, 5 distinct CTF records for arrays are expected
> +   b1 : cta_nelems = 2
> +   c1 : cta_nelems = 3
> +   a1 : cta_nelems = 2, 5
> +   buf : cta_nelems = 0.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "0x12000000\[\t \]+\[^\n\]*ctt_info" 5 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*cta_nelems" 2 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x3\[\t \]+\[^\n\]*cta_nelems" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x5\[\t \]+\[^\n\]*cta_nelems" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*cta_nelems" 1 } } */
> +
> +int b1[2] = {0,1};
> +int c1[5] = {0,1,2,3,4};
> +int a1[2][3] = { {3,4,5}, {2,3,4} };
> +
> +/* Variable length struct using arrays.  */
> +struct my_array
> +{
> +  int flags;
> +  int length;
> +  int buf[];
> +} my_array_obj;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-2.c
> new file mode 100644
> index 00000000000..2a19da050fe
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-2.c
> @@ -0,0 +1,38 @@
> +/* CTF generation for unsized arrays.
> +
> +   Unsized arrays are encoded with a 0 for the number of elements.  The type
> +   of array index is the INT type.
> +
> +   TBD_CTF_FORMAT_OPEN_ISSUES (1) -
> +   This testcase makes a note of the case of a probable misrepresentation.
> +   See Note 1 and Note 2 below.
> +
> +   In the CTF section, these types are encoded as :
> +
> +     Variables:
> +      _CTF_NEWSTR ->  7: const char [0] (size 0x0)
> +      _CTF_SECTION ->  6: const char [5] (size 0x5)
> +      b1 ->  2: int [0] (size 0x0)
> +      b2 ->  3: int [0] (size 0x0)
> +
> +    Note 1 : There is misrepresentation in that b1 and b2 are specified
> +    differently by the user.
> +    Note 2 : It is arguable though whether the representation for
> +    _CTF_NEWSTR is incorrect.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "0x12000000\[\t \]+\[^\n\]*ctt_info" 5 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*cta_nelems" 3 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x5\[\t \]+\[^\n\]*cta_nelems" 1 } } */
> +
> +static int b1[] = {};
> +
> +int b2[0];
> +
> +const char _CTF_SECTION[] = ".ctf";
> +
> +extern const char _CTF_NEWSTR[];
> +const char _CTF_NEWSTR[] = "ctfinfo";
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-3.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-3.c
> new file mode 100644
> index 00000000000..8def2084c6d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-3.c
> @@ -0,0 +1,17 @@
> +/* CTF generation for variable length arrays.
> +
> +   In this testcase, a specific flavor of vla appears in the function
> +   signature.
> +
> +   TBD_CTF_FORMAT_OPEN_ISSUES (1) -
> +   This testcase makes a note of another case of a probable misrepresentation.
> +   See ctf-array-2.c for some context on how vla's are a case of a probable
> +   misrepresentation in CTF.  Nevertheless, compilation should not fail.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-gctf" } */
> +
> +int foo (int a, int b[a][a])
> +{
> +  return b[a-1][a-3];
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-4.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-4.c
> new file mode 100644
> index 00000000000..013a8ff98d7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-array-4.c
> @@ -0,0 +1,13 @@
> +/* CTF generation for array type.
> +
> +   Test CTF generation for single element arrays.  In this testcase, one CTF
> +   record for array is expected with cta_nelems = 1.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "0x12000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x1\[\t \]+\[^\n\]*cta_nelems" 1 } } */
> +
> +int b[1];
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-attr-mode-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-attr-mode-1.c
> new file mode 100644
> index 00000000000..fc3af037b8b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-attr-mode-1.c
> @@ -0,0 +1,22 @@
> +/* Test CTF generation works well with ((mode)) attribute.
> +
> +   In this testcase, CTF should report type of bqi to be an enum and
> +   not an int.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"B1.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"B2.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"B3.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "cte_value" 3} } */
> +
> +/* There are no better/direct methods to assert that the CTF for typedef of
> +   enum has been added.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x22000003\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x2a000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x3\[\t \]+\[^\n\]*ctv_typeidx" 1} } */
> +
> +typedef enum { B1 = 1, B2 = 2, B3 = 3 } B;
> +B __attribute__ ((mode (QI))) bqi;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-attr-used-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-attr-used-1.c
> new file mode 100644
> index 00000000000..61f6b6410de
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-attr-used-1.c
> @@ -0,0 +1,22 @@
> +/* Test CTF generation works well with ((used)) function attribute.
> +
> +   This attribute, attached to a function, means that code must be emitted for
> +   the function even if it appears that the function is not referenced.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O2 -gctf -dA" } */
> +
> +/* These should be true for higher optimization levels.  */
> +/* { dg-final { scan-assembler-times "ascii \"keep_this.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"lose_this.0\"\[\t \]+\[^\n\]*ctf_string" 0 } } */
> +
> +static int lose_this(int a)
> +{
> +    return a + 2;
> +}
> +
> +__attribute__((used))
> +static int keep_this(double a)
> +{
> +    return a * 2;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-1.c
> new file mode 100644
> index 00000000000..1deac90f256
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-1.c
> @@ -0,0 +1,30 @@
> +/* CTF generation for bitfields.
> +
> +   In this testcase, two slices are expected - one for enum and the other for
> +   int.  CTF slices are unnamed records.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*cts_bits" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x3\[\t \]+\[^\n\]*cts_bits" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*ctt_name" 2 } } */
> +
> +enum color
> +{
> +  RED,
> +  GREEN,
> +  BLUE,
> +  YELLOW,
> +  ORANGE,
> +  BLACK
> +};
> +
> +struct quickcolor
> +{
> +  enum color col:3;
> +  int brushid:2;
> +  int strokes;
> +};
> +
> +struct quickcolor qc;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-2.c
> new file mode 100644
> index 00000000000..aea09219dba
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-2.c
> @@ -0,0 +1,39 @@
> +/* The bitfield type (int) may be shared, but slices are not de-duplicated.
> +
> +   In this testcase, it is expected to see a total of 6 CTF slices and 2 CTF
> +   integer types for the bitfields - unsigned long long and signed long long.
> +
> +   cts_offset is the offset of the bitfield into a machine word.
> +   TBD - hardcoding cts_offset checks into the testcase will cause it to break
> +   across targets with different BIT_PER_WORD.  Is there a way to add
> +   cts_offset related checks in the testcase?  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x6\[\t \]+\[^\n\]*cts_type" 3 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*cts_type" 3 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0xf\[\t \]+\[^\n\]*cts_bits" 2 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x21\[\t \]+\[^\n\]*cts_bits" 2 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x10\[\t \]+\[^\n\]*cts_bits" 2 } } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"long long unsigned int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"long long int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +struct fields
> +{
> +  unsigned long long u1 : 15;
> +  unsigned long long u2 : 33;
> +  unsigned long long u3 : 16;
> +  signed long long   s1 : 15;
> +  signed long long   s2 : 33;
> +  signed long long   s3 : 16;
> +} flags;
> +
> +int i = 33;
> +
> +int main ()
> +{
> +    return flags.u1 + i;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-3.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-3.c
> new file mode 100644
> index 00000000000..8fbcf122f80
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-3.c
> @@ -0,0 +1,16 @@
> +/* The bool bitfield type.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*cts_type" 2 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x1\[\t \]+\[^\n\]*cts_bits" 2 } } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"_Bool.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +#include <stdbool.h>
> +
> +struct open_file {
> +  bool mmapped:1;
> +  bool released:1;
> +} of;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-4.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-4.c
> new file mode 100644
> index 00000000000..012069ac918
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-bitfields-4.c
> @@ -0,0 +1,19 @@
> +/* The zero sized bitfield.
> +
> +   In this testcase, two slices are expected.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*cts_type" 2 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x5\[\t \]+\[^\n\]*cts_bits" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0xa\[\t \]+\[^\n\]*cts_bits" 1 } } */
> +
> +/* { dg-final { scan-assembler-times "ctm_name" 2 } } */
> +struct foo
> +{
> +  int a:5;
> +  unsigned:0;
> +  int b:10;
> +} foome;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-complex-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-complex-1.c
> new file mode 100644
> index 00000000000..a36dd9b6b90
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-complex-1.c
> @@ -0,0 +1,21 @@
> +/* Tests for CTF complex base types.
> +
> +   CTF does not have representation for complex integer types.
> +
> +   This testcase has a mix of C constructs containing COMPLEX_TYPE.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-require-effective-target libc_has_complex_functions } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"complex double.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"complex long double.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"complex float.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +#include <complex.h>
> +
> +double complex z1 = I * I;
> +
> +const long double complex z2 = I * I;
> +
> +float complex z4 = 1+2.11*I;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-1.c
> new file mode 100644
> index 00000000000..9368d47ea0c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-1.c
> @@ -0,0 +1,65 @@
> +/* Test compilation of stubs with various qualifiers - const, restrict and
> +   volatile.
> +
> +   Testcase includes a std header to allow testing of shared types across
> +   files.  Only one CTF record for int is expected.
> +
> +   CTF records for CVR qualifiers are no-name records.  In this testcase, there
> +   are 5 qualifiers across constructs.  2 more no-name CTF records correspond to
> +   CTF pointer records.
> +
> +    TYPEID: name string (size) -> ref TYPEID : ref name string (size) -> ...
> +
> +   Types:
> +      1: long int (size 0x8)
> +      2: long unsigned int (size 0x8)
> +      3: size_t (size 0x8) -> 2: long unsigned int (size 0x8)
> +      4: int (size 0x4)
> +      5: const int (size 0x4) -> 4: int (size 0x4)
> +      6: volatile const int (size 0x4) -> 5: const int (size 0x4) -> 4: int (size 0x4)
> +      7: long long int (size 0x8)
> +      8: long double (size 0x10)
> +      9: int * (size 0x8) -> 4: int (size 0x4)
> +      a: int *restrict (size 0x8) -> 9: int * (size 0x8) -> 4: int (size 0x4)
> +      b: const int * (size 0x8) -> 5: const int (size 0x4) -> 4: int (size 0x4)
> +      c: const int *restrict (size 0x8) -> b: const int * (size 0x8) -> 5: const int (size 0x4) -> 4: int (size 0x4)
> +      d: INTP (size 0x8) -> 9: int * (size 0x8) -> 4: int (size 0x4)
> +      e: const INTP (size 0x8) -> d: INTP (size 0x8) -> 9: int * (size 0x8) -> 4: int (size 0x4)
> +      f: void (size 0x0)
> +      10: void (*) (size_t, int *restrict, const int *restrict) (size 0x0)
> +    */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*ctt_name" 7 } } */
> +
> +/* type id 9, b have POINTER type.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*ctt_info" 2 } } */
> +
> +/* type id 5, e have CONST qualifier.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x32000000\[\t \]+\[^\n\]*ctt_info" 2 } } */
> +
> +/* type id a, c have RESTRICT qualifier.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x36000000\[\t \]+\[^\n\]*ctt_info" 2 } } */
> +
> +/* type id 6 has VOLATILE qualifier.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x2e000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +
> +#include "stddef.h"
> +
> +const volatile int a = 5;
> +int *restrict b;
> +
> +const int * i;
> +int const * j;
> +
> +typedef int * INTP;
> +const INTP int_p;
> +
> +void foo (size_t n, int *restrict p, const int *restrict q)
> +{
> +  while (n-- > 0)
> +    *p++ = *q++;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-2.c
> new file mode 100644
> index 00000000000..4f328f3a5ac
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-2.c
> @@ -0,0 +1,30 @@
> +/* Test compilation of stubs with various expressions involving const
> +   qualifier.
> +
> +   In this testcase, a single CTF record for const int is expected. A total of
> +   two const qualifier CTF records are expected (const int and const struct
> +   s1).  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x32000000\[\t \]+\[^\n\]*ctt_info" 2 } } */
> +
> +struct mystruct
> +{
> +  struct
> +    {
> +      int a;
> +      const int b;
> +    } s1;
> +  char * name;
> +} my_a;
> +
> +struct s1
> +{
> +  int i;
> +  const int ci;
> +} s;
> +
> +const struct s1 cs;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-3.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-3.c
> new file mode 100644
> index 00000000000..97317a47b8f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-3.c
> @@ -0,0 +1,25 @@
> +/* Test compilation of stubs with various expressions involving const and
> +   volatile qualifiers.
> +
> +   In this testcase, it is expected to have const and volatile CTF
> +   records.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"unsigned char.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x2e000000\[\t \]+\[^\n\]*ctt_info" 5 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x32000000\[\t \]+\[^\n\]*ctt_info" 3 } } */
> +/* Two arrays.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x12000000\[\t \]+\[^\n\]*ctt_info" 2 } } */
> +
> +
> +const volatile unsigned char  vicar = 11;
> +
> +const volatile unsigned char * vicarage = &vicar;
> +
> +volatile float vilify[2];
> +
> +const volatile char victor = 'Y';
> +
> +const volatile char vindictive[2];
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-4.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-4.c
> new file mode 100644
> index 00000000000..c1633ee935d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-cvr-quals-4.c
> @@ -0,0 +1,23 @@
> +/* Test compilation of stubs with various qualifiers - const, restrict and
> +   volatile.
> +
> +   CTF records for CVR qualifiers are no-name records.  In this testcase, there
> +   is 1 const qualifier. 1 more no-name CTF record corresponds to the CTF
> +   pointer record.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*ctt_name" 2 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x32000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +
> +typedef const struct howto_struct howto_type;
> +
> +typedef struct entry
> +{
> +  int addend;
> +  howto_type *howto;
> +} how_ent;
> +
> +how_ent hent;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-debug-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-debug-1.c
> new file mode 100644
> index 00000000000..1ad5f2593df
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-debug-1.c
> @@ -0,0 +1,7 @@
> +/* Verify that CTF debug info can co-exist with dwarf.  */
> +/* { dg-do compile } */
> +/* { dg-options "-gctf -gdwarf -dA" } */
> +/* { dg-final { scan-assembler "0xdff2.*CTF preamble magic number" } } */
> +
> +void func (void)
> +{ }
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-debug-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-debug-2.c
> new file mode 100644
> index 00000000000..df2c1ebbb30
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-debug-2.c
> @@ -0,0 +1,7 @@
> +/* Verify that CTF debug info can co-exist with dwarf.  */
> +/* { dg-do compile } */
> +/* { dg-options "-gdwarf -gctf -dA" } */
> +/* { dg-final { scan-assembler "0xdff2.*CTF preamble magic number" } } */
> +
> +void func (void)
> +{ }
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-enum-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-enum-1.c
> new file mode 100644
> index 00000000000..969354431ba
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-enum-1.c
> @@ -0,0 +1,21 @@
> +/* CTF generation for enums.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"RED.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"GREEN.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"BLUE.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"YELLOW.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "cte_value" 4} } */
> +
> +
> +enum foo_color
> +{
> +  RED,
> +  GREEN,
> +  BLUE,
> +  YELLOW
> +};
> +
> +enum foo_color my_color;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-enum-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-enum-2.c
> new file mode 100644
> index 00000000000..fd8aaeced84
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-enum-2.c
> @@ -0,0 +1,27 @@
> +/* CTF generation for enums.
> +
> +   CTF represents enum values with an int32_t.  For enum values not
> +   representable with int32_t data type, the compiler skips adding CTF for
> +   them.  This will be fixed soon in the CTF format.
> +   TBD_CTF_REPRESENTATION_LIMIT.
> +
> +   In this testcase, CTF for enumerator GFS_MONOTONIC will not be generated.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"GFS_MONOTONIC.0\"\[\t \]+\[^\n\]*ctf_string" 0 } } */
> +/* { dg-final { scan-assembler-times "ascii \"GFS_RUNTIME.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"GFS_STATIC.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "cte_value" 2} } */
> +
> +
> +enum gomp_schedule_type
> +{
> +  GFS_RUNTIME,
> +  GFS_STATIC,
> +  GFS_MONOTONIC = 0x80000000U
> +};
> +
> +enum gomp_schedule_type gsch_type;
> +
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-file-scope-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-file-scope-1.c
> new file mode 100644
> index 00000000000..a683113e505
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-file-scope-1.c
> @@ -0,0 +1,25 @@
> +/* CTF is not generated for entities not at file-scope.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"SFOO.0\"\[\t \]+\[^\n\]*ctf_string" 0 } } */
> +/* { dg-final { scan-assembler-times "ascii \"gfoo.0\"\[\t \]+\[^\n\]*ctf_string" 0 } } */
> +/* { dg-final { scan-assembler-times "ascii \"foo.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +int foo (int n)
> +{
> +  typedef struct { int a[n]; } SFOO;
> +
> +  SFOO a;
> +  __attribute__ ((noinline)) SFOO gfoo (void) { return a; }
> +
> +  a.a[0] = 1;
> +  a.a[9] = 2;
> +
> +  SFOO b;
> +  b = gfoo ();
> +
> +  return b.a[0] == 1 && b.a[9] == 2;
> +}
> +
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-float-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-float-1.c
> new file mode 100644
> index 00000000000..9e24b450ea5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-float-1.c
> @@ -0,0 +1,16 @@
> +/* Tests for CTF float base types.
> +   - Verify that there is a single record for the base types.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-final { scan-assembler-times "ascii \"float.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"double.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"long double.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +float a;
> +float b = 33;
> +
> +double c = 44;
> +double d = 45;
> +
> +long double e;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-forward-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-forward-1.c
> new file mode 100644
> index 00000000000..fdec7433288
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-forward-1.c
> @@ -0,0 +1,40 @@
> +/* CTF forward type is generated for forward declarations of types in C.
> +
> +   Check that the ctf-kind of CTF_K_FOWARD type is CTF_K_STRUCT or CTF_K_UNION.
> +   For forward types, the compiler encodes the CTF kind in the ctt_type field.
> +   CTF_K_FORWARD is used as the CTF type as usual in the ctt_info.  */
> +
> +/* Note - A value of 6 in "ctt_size or ctt_type" appears twice in this
> +   testcase. This might be misconstrued as  2 CTK_K_FORWARD records of struct
> +   type.  The second assembler tag is due to a ref type in a CVR CTF record.
> +   TBD - perhaps a more robust string pattern is needed.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x26000000\[\t \]+\[^\n\]*ctt_info" 2 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x6\[\t \]+\[^\n\]*ctt_size or ctt_type" 2 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x7\[\t \]+\[^\n\]*ctt_size or ctt_type" 2 } } */
> +
> +typedef struct __locale_struct
> +{
> +  struct __locale_data *__locales[13]; /* forward struct type.  */
> +
> +  const int *__ctype_toupper;
> +  const char *__names[13];
> +} *__locale_t;
> +
> +typedef __locale_t locale_t;
> +
> +locale_t loc;
> +
> +typedef struct __inter_struct
> +{
> +  union __inter_data * __inters[13]; /* forward union type.  */
> +
> +  const int * __ctype_kind;
> +} * __inter_t;
> +
> +typedef __inter_t inter_t;
> +
> +inter_t inter;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-forward-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-forward-2.c
> new file mode 100644
> index 00000000000..a3154f2b2d4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-forward-2.c
> @@ -0,0 +1,16 @@
> +/* CTF forward type is generated for forward declarations of enum types in C.
> +
> +   Check that the ctf-kind of CTF_K_FOWARD type is CTF_K_ENUM.
> +   For forward types, the compiler encodes the CTF kind in the ctt_type field.
> +   CTF_K_FORWARD is used as the CTF type as usual in the ctt_info.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x26000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x8\[\t \]+\[^\n\]*ctt_size or ctt_type" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"vibgyor.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +enum vibgyor;
> +
> +char * (*get_color_name) (enum vibgyor);
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-func-index-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-func-index-1.c
> new file mode 100644
> index 00000000000..86ca795c9ab
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-func-index-1.c
> @@ -0,0 +1,25 @@
> +/* CTF function index sub-section.
> +
> +   A function index sub-section in the CTF section contains the offset to the
> +   string name of the global function symbols.  The number of entries in the
> +   func info section and the func index section are always the same.
> +
> +   In this testcase, 2 records in the function index section are expected.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "funcinfo_name" 2 } } */
> +/* { dg-final { scan-assembler-times "funcinfo_func_type" 2 } } */
> +/* { dg-final { scan-assembler-times "ascii \"bar.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"foo.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +int foo (void)
> +{
> +  return 0;
> +}
> +
> +int bar (int a)
> +{
> +  return 33 + a;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-1.c
> new file mode 100644
> index 00000000000..cc1a600adbd
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-1.c
> @@ -0,0 +1,24 @@
> +/* CTF generation of function pointers.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x16000001\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x16000002\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x16000003\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"__foo_fn.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"destroy.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"func.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +int (*func) (int *, char);
> +
> +typedef int (*__foo_fn) (void *__cookie, char *__buf, int __nbytes);
> +
> +typedef struct object
> +{
> +   int myint;
> +   char mychar;
> +   void (*destroy)(struct object *);
> +} object_t;
> +
> +object_t myobj;
> +__foo_fn fooit;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-2.c
> new file mode 100644
> index 00000000000..a4a1104ae8c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-2.c
> @@ -0,0 +1,22 @@
> +/* CTF generation of function pointers.
> +
> +   In this testcase,  there is a single function type expected for two
> +   different function pointer types.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x16000001\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"rcu_callback_t.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"func.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +struct callback_head {
> +      struct callback_head *next;
> +        void (*func) (struct callback_head *head);
> +} __attribute__ (( aligned (sizeof (void *))));
> +#define rcu_head callback_head
> +
> +struct callback_head chead;
> +
> +typedef void (*rcu_callback_t) (struct rcu_head *head);
> +
> +rcu_callback_t rcb;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-3.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-3.c
> new file mode 100644
> index 00000000000..fe35d6c7f2e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-3.c
> @@ -0,0 +1,21 @@
> +/* CTF generation of function pointers.
> +
> +   In this testcase,  there is a single function type expected.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x16000001\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"foo_init_callback.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"fn.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +struct foo;
> +
> +typedef void (* foo_init_callback) (struct foo *f1);
> +
> +struct foo
> +{
> +  /* Function to call to initialize.  */
> +  foo_init_callback fn;
> +};
> +
> +struct foo f;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-4.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-4.c
> new file mode 100644
> index 00000000000..b8a741766ed
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-4.c
> @@ -0,0 +1,18 @@
> +/* CTF generation of function pointers.
> +
> +   In this testcase, Type de-duplication of function type is exercised.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x16000001\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"var_assign_func_t.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +struct variable;
> +
> +typedef struct variable *var_assign_func_t (struct variable *);
> +
> +typedef struct variable {
> +  var_assign_func_t *assign_func;
> +} shell_var_t;
> +
> +shell_var_t a;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-functions-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-functions-1.c
> new file mode 100644
> index 00000000000..0b086a5af3d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-functions-1.c
> @@ -0,0 +1,34 @@
> +/* CTF generation for functions with varargs or otherwise.
> +
> +   In this testcase, it is expected to see one CTF_K_FUNCTION record with two
> +   function arguments.  The second function argument with a value of 0
> +   corresponds to the ellipsis.
> +
> +   Example CTF section excerpt on x86_64 :
> +
> +    .long   0x5     # ctt_name             (name = format)
> +    .long   0x16000002      # ctt_info     (CTF_K_FUNCTION with 2 arguments)
> +    .long   0x2     # ctt_size or ctt_type  (return typeID)
> +    .long   0x2     # dtu_argv             (TypeID of the First argument)
> +    .long   0       # dtu_argv             (TypeID of the second argument)
> +    .ascii "\0"     # ctf_string
> +    .ascii "int\0"  # ctf_string
> +    .ascii "format\0"       # ctf_string
> +
> +    */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x16000002\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "dtu_argv" 2 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*dtu_argv" 1 } } */
> +
> +int foo (void);
> +
> +int bar (int);
> +
> +int * format (int * fmt, ...)
> +{
> +  return fmt;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-int-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-int-1.c
> new file mode 100644
> index 00000000000..8c68b2e7ede
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-int-1.c
> @@ -0,0 +1,17 @@
> +/* Tests for CTF integer base types.
> +   - Verify that there is a single record for the base types.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"short int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"long int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +int a;
> +int b = 33;
> +
> +short int c = 44;
> +short int d = 45;
> +
> +long int e = 90;
> +long int f;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-objt-index-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-objt-index-1.c
> new file mode 100644
> index 00000000000..ee3481af723
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-objt-index-1.c
> @@ -0,0 +1,30 @@
> +/* CTF objext index sub-section.
> +
> +   An object index sub-section in the CTF section contains the offset to the
> +   string name of the global object symbols.  The number of entries in the
> +   obj info section and objt index section are always the same.
> +
> +   In this testcase, 4 records in the object index section are expected.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "objtinfo_name" 4 } } */
> +/* { dg-final { scan-assembler-times "objtinfo_var_type" 4 } } */
> +/* { dg-final { scan-assembler-times "ascii \"a.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"b.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"a1.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"d_instance.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +static int b = 33;
> +
> +int a = 44;
> +int a1[2] = {22, 33};
> +
> +struct d
> +{
> +  int d1;
> +  int d2;
> +};
> +
> +struct d d_instance;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-pointers-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-pointers-1.c
> new file mode 100644
> index 00000000000..e1fccec2d03
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-pointers-1.c
> @@ -0,0 +1,26 @@
> +/* CTF generation for pointer types.
> +
> +   In this testcase, two CTF pointer type records are expected
> +     - int *
> +     - struct foo_struct *
> +  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"foo_struct.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*ctt_info" 2 } } */
> +
> +int b = 44;
> +int * a = &b;
> +
> +struct foo_struct
> +{
> +  int bar_mem_1;
> +  int bar_mem_2;
> +  float d;
> +  struct foo_struct *next;
> +};
> +
> +struct foo_struct * node;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-pointers-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-pointers-2.c
> new file mode 100644
> index 00000000000..e36e5ec741b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-pointers-2.c
> @@ -0,0 +1,25 @@
> +/* CTF generation for pointer types.
> +
> +   In this testcase, de-duplication of pointer types is exercised.  The
> +   compostition of structs in this testcase is such that when adding CTF for
> +   pointer type (link), the pointed-to-type type already adds the pointer to
> +   struct link.
> +
> +   In this testcase, one CTF pointer type record is expected.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +
> +struct link;
> +
> +typedef struct items {
> +    struct link * link;
> +    int str;
> +} itemslist;
> +
> +itemslist il;
> +
> +struct link { struct link * next; };
> +
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-preamble-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-preamble-1.c
> new file mode 100644
> index 00000000000..28547fae9a9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-preamble-1.c
> @@ -0,0 +1,11 @@
> +/* Verify the CTF preamble in the CTF section.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-final { scan-assembler "0xdff2.*CTF preamble magic number" } } */
> +/* { dg-final { scan-assembler "0x4.*CTF preamble version" } } */
> +/* { dg-final { scan-assembler "0.*CTF preamble flags" } } */
> +
> +void func (void)
> +{
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-1.c
> new file mode 100644
> index 00000000000..0c51839460c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-1.c
> @@ -0,0 +1,38 @@
> +/* CTF does not have representation for some types at this time.  These types
> +   are skipped in the CTF generation phase in the compiler.
> +
> +   An explicit CTF type with kind CTF_K_UNKNOWN is created for types that do
> +   not have representation in CTF.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-gctf -dA" } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x2000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"unknown.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +/* { dg-require-effective-target libc_has_complex_functions } */
> +
> +#include <complex.h>
> +
> +typedef float La_x86_64_xmm __attribute__ ((__vector_size__ (16)));
> +La_x86_64_xmm a1;
> +
> +/* GCC also supports complex integer data types.  */
> +complex char a;
> +complex signed char b;
> +complex unsigned char c;
> +complex short int d;
> +complex short unsigned int e;
> +complex int f;
> +complex unsigned int g;
> +complex long int h;
> +complex long unsigned int i;
> +complex long long int j;
> +
> +enum gomp_schedule_type
> +{
> +  GFS_RUNTIME,
> +  GFS_STATIC,
> +  GFS_MONOTONIC = 0x80000000U
> +};
> +
> +enum gomp_schedule_type gsch_type;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-2.c
> new file mode 100644
> index 00000000000..7c8b17df6db
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-2.c
> @@ -0,0 +1,17 @@
> +/* CTF does not have representation for some types at this time.  These types
> +   are skipped in the CTF generation phase in the compiler.
> +
> +   Skip IEEE interchange and extended formats for CTF generation.
> +
> +   In this testcase, CTF records for types are not added as CTF has no
> +   representation for IEEE interchange and extended formats.
> +
> +   CTF records for variables do exist, however.  The referenced type is
> +   CTF_TYPE_NULLID.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-gctf" } */
> +
> +/* { dg-require-effective-target float16 } */
> +
> +_Float16 f16;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-3.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-3.c
> new file mode 100644
> index 00000000000..394fa2f7b41
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-3.c
> @@ -0,0 +1,20 @@
> +/* CTF does not have representation for some types at this time.  These types
> +   are skipped in the CTF generation phase in the compiler.
> +
> +   Skip IEEE interchange and extended formats for CTF generation.
> +
> +   In this testcase, CTF records for types are not added as CTF has no
> +   representation for IEEE interchange and extended formats.
> +
> +   CTF records for variables and pointer do exist, however.  The referenced
> +   type is CTF_TYPE_NULLID.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-gctf" } */
> +
> +/* { dg-require-effective-target float32 } */
> +/* { dg-require-effective-target float32x } */
> +
> +_Float32 f32;
> +_Float32x f32x;
> +_Float32 * f32p;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-4.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-4.c
> new file mode 100644
> index 00000000000..f4374e6f0f7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-4.c
> @@ -0,0 +1,19 @@
> +/* CTF does not have representation for some types at this time.  These types
> +   are skipped in the CTF generation phase in the compiler.
> +
> +   Skip IEEE interchange and extended formats for CTF generation.
> +
> +   In this testcase, CTF records for types are not added as CTF has no
> +   representation for IEEE interchange and extended formats.
> +
> +   CTF records for variables and pointer do exist, however.  The referenced
> +   type is CTF_TYPE_NULLID.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-gctf" } */
> +
> +/* { dg-require-effective-target float64 } */
> +/* { dg-require-effective-target float64x } */
> +
> +_Float64 f64;
> +_Float64x f64x;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-5.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-5.c
> new file mode 100644
> index 00000000000..026f9e06f67
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-5.c
> @@ -0,0 +1,19 @@
> +/* CTF does not have representation for some types at this time.  These types
> +   are skipped in the CTF generation phase in the compiler.
> +
> +   Skip IEEE interchange and extended formats for CTF generation.
> +
> +   In this testcase, CTF records for types are not added as CTF has no
> +   representation for IEEE interchange and extended formats.
> +
> +   CTF records for variables and pointer do exist, however.  The referenced
> +   type is CTF_TYPE_NULLID.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-gctf" } */
> +
> +/* { dg-require-effective-target float128 } */
> +/* { dg-require-effective-target float128x } */
> +
> +_Float128 f128;
> +_Float128x f128x;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-6.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-6.c
> new file mode 100644
> index 00000000000..f2dbe08774f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-6.c
> @@ -0,0 +1,18 @@
> +/* CTF does not have representation for some types at this time.  These types
> +   are skipped in the CTF generation phase in the compiler.
> +
> +   Skip Decimal Floating Point format types for CTF generation.
> +
> +   In this testcase, CTF records for types are not added as CTF has no
> +   representation for Decimal floating point format.
> +
> +   CTF records for variables do exist, however.  The referenced type is
> +   CTF_TYPE_NULLID.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-gctf" } */
> +/* { dg-require-effective-target dfp } */
> +
> +_Decimal32 d32;
> +_Decimal64 d64;
> +_Decimal128 d128;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-7.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-7.c
> new file mode 100644
> index 00000000000..a9d86de6482
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-7.c
> @@ -0,0 +1,18 @@
> +/* CTF does not have representation for some types at this time.  These types
> +   are skipped in the CTF generation phase in the compiler.
> +
> +   Skip IEEE interchange and extended formats for CTF generation.
> +
> +   In this testcase, CTF records for types are not added as CTF has no
> +   representation for IEEE interchange and extended formats.  This testcase
> +   checks that CTF generation skips the 128-bit float gracefully, when code
> +   generation is for a 32-bit environment.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-gctf -m32" } */
> +
> +/* { dg-require-effective-target float128 } */
> +/* { dg-require-effective-target float128x } */
> +
> +_Float128 f128;
> +_Float128x f128x;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-8.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-8.c
> new file mode 100644
> index 00000000000..2413e91d307
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-skip-types-8.c
> @@ -0,0 +1,27 @@
> +/* CTF does not have representation for _Atomic qualifier.  This qualifier is
> +   skipped in the CTF generation phase in the compiler.
> +
> +   In this testcase, CTF records for the _Atomic qualifier are not added as
> +   CTF has no representation for it. CTF records for the underlying type are,
> +   however, added.  So, CTF records for typedef, const and the underlying
> +   struct are expected.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x2a000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x32000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x1a000003\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ctm_name" 3 } } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"comp_type.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"comp_type_t.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"c1.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +typedef struct comp_type
> +{
> +  int a;
> +  float b;
> +  char c;
> +} comp_type_t;
> +
> +_Atomic const comp_type_t c1;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-str-table-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-str-table-1.c
> new file mode 100644
> index 00000000000..0a0f1f033f7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-str-table-1.c
> @@ -0,0 +1,26 @@
> +/* CTF String Table as generated by the compiler is expected to have only a
> +   single empty string.  Just an optimization by the compiler, it is not
> +   mandated by the CTF format.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-final { scan-assembler-times "ascii \".0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +union wait
> +{
> +  int w_status;
> +  struct
> +    {
> +      int __w_termsig;
> +      int __w_coredump;
> +    } __wait_terminated;
> +   struct
> +    {
> +      int __w_stopval;
> +      int __w_stopsig;
> +    } __wait_stopped;
> +};
> +
> +typedef union { union wait * __uptr; int * iptr; } __WAIT_STATUS;
> +
> +__WAIT_STATUS waitstatus;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-1.c
> new file mode 100644
> index 00000000000..19711c04bf7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-1.c
> @@ -0,0 +1,25 @@
> +/* Test compilation of struct type.
> +
> +   In this testcase, two CTF_K_STRUCT records are expected
> +   struct a : ctt_info = 0x1a000004 (4 field members)
> +   struct b : ctt_into = 0x1a000002 (2 field members)
> +*/
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x1a000004\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x1a000002\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ctm_name" 6 } } */
> +
> +struct a
> +{
> +  int d1;
> +  int d2;
> +  float c;
> +  struct b
> +    {
> +      int time;
> +      int wall;
> +    } b1;
> +} my_a;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-2.c
> new file mode 100644
> index 00000000000..09b4d2f8f78
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-2.c
> @@ -0,0 +1,32 @@
> +/* Test for compilation of self-referntial structs.
> +
> +   Further, the compiler is expected to generate a single CTF struct type for
> +   struct dmx_dtdef (due to Type de-duplication at CTF generation).  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-final { scan-assembler-times "ascii \"dmx_dtdef.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"dtd_name.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"dtd_type.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"dmx_dtdef_t.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +struct link
> +{
> +  struct link * next;
> +} * s_link;
> +
> +typedef long dmx_id_t;
> +
> +typedef struct dmx_dtdef
> +{
> +  char * dtd_name;
> +  dmx_id_t dtd_type;
> +} dmx_dtdef_t;
> +
> +typedef struct dmx_bundle
> +{
> +  dmx_id_t dmb_type;
> +  dmx_dtdef_t * dmb_dtd;
> +} dmx_bundle_t;
> +
> +dmx_bundle_t dbt;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-array-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-array-1.c
> new file mode 100644
> index 00000000000..d6c6b6be91f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-array-1.c
> @@ -0,0 +1,65 @@
> +/* Test Compilation of mixed constructs containing structs and arrays.
> +
> +   Further, the compiler is expected to generate a single CTF struct type for
> +   struct cmodel (due to Type de-duplication at the time of CTF generation).
> +
> +   const qualifier in fields of structs should be processed.  It appears as a
> +   no-name CTF record with appropriate ctt_info.  In this testcase, there are
> +   two const qualifiers - const char and const struct cmodel.  However, due to
> +   way the debug information is represented in DWARF die, 3 const qualifier
> +   records appear in the CTF section.
> +
> +   <1><e1>: Abbrev Number: 14 (DW_TAG_typedef)
> +      <e2>   DW_AT_name        : (indirect string, offset: 0x114): cmodel_t
> +      <e9>   DW_AT_type        : <0x9a>
> +   <1><ed>: Abbrev Number: 13 (DW_TAG_const_type)
> +      <ee>   DW_AT_type        : <0xe1>
> +   <1><f2>: Abbrev Number: 4 (DW_TAG_array_type)
> +      <f3>   DW_AT_type        : <0xed>
> +      <f7>   DW_AT_sibling     : <0x102>
> +
> +   <2><101>: Abbrev Number: 0
> +   <1><102>: Abbrev Number: 13 (DW_TAG_const_type)
> +      <103>   DW_AT_type        : <0xf2>
> +   <1><107>: Abbrev Number: 15 (DW_TAG_variable)
> +      <108>   DW_AT_name        : (indirect string, offset: 0x57): _models
> +      <10f>   DW_AT_type        : <0x102>
> +   <1><11d>: Abbrev Number: 0
> +
> +   This results in:
> +
> +   _models ->  e: const const cmodel_t [3] (size 0x30) -> d: const cmodel_t [3] (size 0x30)
> +
> +   Deemed as acceptable for now.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ascii \"cmodel.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"cname.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"cpointer.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"cmodel_t.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +/* 3 const records are expected.  */
> +/* { dg-final { scan-assembler-times "\[\t \]0x32000000\[\t \]+\[^\n\]*ctt_info" 3 } } */
> +
> +struct a
> +{
> +  int a1[2];
> +  struct { int b[3]; } a2;
> +};
> +
> +struct a my_a;
> +
> +typedef struct cmodel
> +{
> +  const char *cname;
> +  int ccode;
> +  int cpointer;
> +} cmodel_t;
> +
> +static const cmodel_t _models[] = {
> +  {"ILP32", 0, 4},
> +  {"LP64", 0, 8},
> +  {"", 0, 0}
> +};
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-array-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-array-2.c
> new file mode 100644
> index 00000000000..9e698fde89e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-array-2.c
> @@ -0,0 +1,15 @@
> +/* CTF generation for struct type in presence of DWARF2.
> +
> +   In case of DWARF2, the data member location is an expression containing
> +   the location.  CTF generation feeds off DWARF dies; this testcase tests
> +   that the location expr is handled.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA -gdwarf-2" } */
> +
> +/* { dg-final { scan-assembler-times "0x12000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x4\[\t \]+\[^\n\]*cta_nelems" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*ctm_offset" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x4\[\t \]+\[^\n\]*ctm_offset" 1 } } */
> +
> +static struct ranges {int from, to;} lim_regs[] = {{ 16, 7}, { 16, 6}, { 20, 7},{ 20, 6}};
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-pointer-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-pointer-1.c
> new file mode 100644
> index 00000000000..22005ed0350
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-pointer-1.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* This tests the following scenario:
> +
> +   1. struct foo;
> +   2. struct foo *a_foo;
> +   3. struct foo { int bar; };
> +   4. void baz (struct foo *f) { f->bar = 0; }
> +
> +   At 2. a forward for struct foo is generated and at 3. the struct
> +   type is fully defined.  When a pointer to foo is encountered at 4.,
> +   an additional CTF type for the completed struct shall be emitted as
> +   well.  The linker will deduplicate both types.  */
> +
> +struct foo;
> +struct foo *a_foo;
> +struct foo { int bar; };
> +void baz (struct foo *f) { f->bar = 0; }
> +
> +/* { dg-final { scan-assembler-times "\[\t \]\"bar.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-pointer-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-pointer-2.c
> new file mode 100644
> index 00000000000..569e5e237d9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-struct-pointer-2.c
> @@ -0,0 +1,22 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* This tests the following scenario:
> +
> +   1. struct foo;
> +   2. struct foo *a_foo;
> +   3. struct foo { int bar; };
> +   4. void baz (struct foo **f) { f->bar = 0; }
> +
> +   At 2. a forward for struct foo is generated and at 3. the struct
> +   type is fully defined.  When a pointer to a pointer to foo is
> +   encountered at 4., an additional CTF type for the completed struct
> +   shall be emitted as well.  The linker will deduplicate both
> +   types.  */
> +
> +struct foo;
> +struct foo *a_foo;
> +struct foo { int bar; };
> +void baz (struct foo **f) { (*f)->bar = 0; }
> +
> +/* { dg-final { scan-assembler-times "\[\t \]\"bar.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-1.c
> new file mode 100644
> index 00000000000..aa40ab0a671
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-1.c
> @@ -0,0 +1,68 @@
> +/* CTF_K_TYPEDEF record generation.
> +
> +   In this testcase, 7 typedef records are expected.
> +
> +   Further, the declared variables must be of type typedef
> +
> +     Variables:
> +       a ->  2: my_int (size 0x4) -> 1: int (size 0x4)
> +       b ->  3: bar_int (size 0x4) -> 1: int (size 0x4)
> +       c ->  4: foo_int (size 0x4) -> 1: int (size 0x4)
> +       d ->  7: my_array (size 0x8) -> 5: struct  (size 0x8)
> +       e ->  9: CINT (size 0x4) -> 8: const int (size 0x4) -> 1: int (size 0x4)
> +       f ->  c: CINTP (size 0x8) -> b: const int * (size 0x8) -> a: const int (size 0x4) -> 1: int (size 0x4)
> +       g ->  f: my_node_t (size 0x8) -> d: struct my_node (size 0x8)
> +
> +    There is no direct way to check that the variables are of type typedef.
> +    So in this testcase, we simply check that:
> +    1. The typedef records are generated (Check for 7 specific ctt_info, and
> +       check for the ascii strings for the typedef names).
> +    2. The ctv_typeidx are distinct (each pointing to a specfic unique type).
> +       Note that if variables were not of type typedef, ctv_typeidx will not be
> +       unique (type of a, b, c will all point to int); hence, the check.
> +   */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "0x2a000000\[\t \]+\[^\n\]*ctt_info" 7 } } */
> +/* { dg-final { scan-assembler-times "ascii \"my_int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"bar_int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"foo_int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"my_array.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"CINT.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"CINTP.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"my_node_t.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*ctv_typeidx" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x4\[\t \]+\[^\n\]*ctv_typeidx" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x5\[\t \]+\[^\n\]*ctv_typeidx" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x9\[\t \]+\[^\n\]*ctv_typeidx" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0xa\[\t \]+\[^\n\]*ctv_typeidx" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0xc\[\t \]+\[^\n\]*ctv_typeidx" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0xf\[\t \]+\[^\n\]*ctv_typeidx" 1 } } */
> +
> +typedef int my_int;
> +typedef int bar_int;
> +typedef int foo_int;
> +
> +typedef struct { int a[2]; } my_array;
> +
> +typedef const int CINT;
> +typedef const int * CINTP;
> +
> +typedef struct my_node
> +{
> +  int flags;
> +  char value;
> +} my_node_t;
> +
> +my_int a;
> +bar_int b;
> +foo_int c;
> +
> +my_array d;
> +CINT e = 3;
> +CINTP f = &e;
> +
> +my_node_t g;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-2.c
> new file mode 100644
> index 00000000000..8c9d3bb19ce
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-2.c
> @@ -0,0 +1,20 @@
> +/* CTF_K_TYPEDEF record generation.
> +
> +   In this testcase, typedef of type void should be generated.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "0x2a000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"foo_void_type.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"void.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +typedef void foo_void_type;
> +
> +struct bar
> +{
> +  int a;
> +  foo_void_type *b;
> +};
> +
> +struct bar c;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-3.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-3.c
> new file mode 100644
> index 00000000000..93d0845b042
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-3.c
> @@ -0,0 +1,24 @@
> +/* Type de-duplication of CTF_K_TYPEDEF records.
> +
> +   In this testcase, a single CTF record for typedef is expected.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "0x2a000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"foo_type.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +/* { dg-final { scan-assembler-times "ascii \"foo.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */
> +
> +typedef struct foo foo_type;
> +
> +struct bar
> +{
> +  struct foo * f1;
> +  foo_type * f2;
> +};
> +
> +struct testme {
> +    struct bar * b1;
> +};
> +
> +struct testme * t1;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-1.c
> new file mode 100644
> index 00000000000..19e8f496105
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-1.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +typedef struct my_int
> +{
> +  int upper;
> +  int lower;
> +  struct bitmask
> +    {
> +      int flags;
> +    } my_mask;
> +} my_int_t;
> +
> +my_int_t mit;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-2.c
> new file mode 100644
> index 00000000000..deeb85aab9d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-2.c
> @@ -0,0 +1,17 @@
> +/* Test compilation of typedef composition in structs.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +typedef struct
> +{
> +  int day, month, year;
> +} Date;
> +
> +typedef struct
> +{
> +  Date filedDate, fixedDate;
> +  int severity;
> +} BugRef;
> +
> +BugRef CR2112;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-3.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-3.c
> new file mode 100644
> index 00000000000..6d6918b1536
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-typedef-struct-3.c
> @@ -0,0 +1,32 @@
> +/* Test CTF generation for a typedef instantiation with CVR quals.
> +
> +   Caveat: There is no direct way to test that the type of foo is
> +   "const my_int_t" via scanning the assembly. This test instead
> +   checks for the presence of some of the CTF constructs involved
> +   individually. Specifically, it checks for CTF const record and
> +   CTF typedef record.
> +
> +  Variables:
> +      foo ->  4: const my_int_t (size 0x8) -> 3: my_int_t (size 0x8) -> 1: struct my_int (size 0x8)
> +
> +   Types:
> +      1: struct my_int (size 0x8)
> +      2: int (size 0x4)
> +      3: my_int_t (size 0x8) -> 1: struct my_int (size 0x8)
> +      4: const my_int_t (size 0x8) -> 3: my_int_t (size 0x8) -> 1: struct my_int (size 0x8)
> +*/
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "\[\t \]0x4\[\t \]+\[^\n\]*ctv_typeidx" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x2a000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x32000000\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +
> +typedef struct my_int
> +{
> +    int upper;
> +      int lower;
> +} my_int_t;
> +
> +const my_int_t foo = {10, 20};
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-union-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-union-1.c
> new file mode 100644
> index 00000000000..929d5329839
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-union-1.c
> @@ -0,0 +1,14 @@
> +/* CTF generation for union type.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +/* { dg-final { scan-assembler-times "\[\t \]0x1e000004\[\t \]+\[^\n\]*ctt_info" 1 } } */
> +/* { dg-final { scan-assembler-times "ctm_name" 4 } } */
> +
> +union c
> +{
> +  int c1;
> +  int c2;
> +  int c3;
> +  int c4;
> +} my_u_c;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-variables-1.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-variables-1.c
> new file mode 100644
> index 00000000000..8c3ab1050e0
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-variables-1.c
> @@ -0,0 +1,25 @@
> +/* CTF generation for global variables.
> +
> +   In this testcase, 7 records in the variable info section are expected.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ctv_name" 7 } } */
> +
> +float var1;
> +double var2;
> +long double var3;
> +
> +char ascii = 'a';
> +
> +int a = 33;
> +int a1[2] = {22, 33};
> +
> +struct d
> +{
> +  int d1;
> +  int d2;
> +};
> +
> +struct d d_instance;
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-variables-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-variables-2.c
> new file mode 100644
> index 00000000000..75c3ed790f4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-variables-2.c
> @@ -0,0 +1,16 @@
> +/* CTF generation for static variables inside a function.
> +
> +   In this testcase, CTF record for bstatic is NOT expected.  CTF generation
> +   is only carried out for variables at file-scope or global-scope.  */
> +
> +/* { dg-do compile )  */
> +/* { dg-options "-O0 -gctf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "ctv_name" 0 } } */
> +/* { dg-final { scan-assembler-times "ascii \"bstatic.0\"\[\t \]+\[^\n\]*ctf_string" 0 } } */
> +
> +int foo (int a)
> +{
> +  static int bstatic = 3;
> +  return a + bstatic;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf.exp b/gcc/testsuite/gcc.dg/debug/ctf/ctf.exp
> new file mode 100644
> index 00000000000..46055f8a2bf
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf.exp
> @@ -0,0 +1,41 @@
> +#   Copyright (C) 2002-2019 Free Software Foundation, Inc.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with GCC; see the file COPYING3.  If not see
> +# <http://www.gnu.org/licenses/>.
> +
> +# GCC testsuite that uses the `dg.exp' driver.
> +
> +# Load support procs.
> +load_lib gcc-dg.exp
> +
> +# Disable on ptx (in sync with DWARF testsuite)
> +if { [istarget nvptx-*-*] } {
> +    return
> +}
> +
> +# If a testcase doesn't have special options, use these.
> +global DEFAULT_CFLAGS
> +if ![info exists DEFAULT_CFLAGS] then {
> +    set DEFAULT_CFLAGS " -ansi -pedantic-errors"
> +}
> +
> +# Initialize `dg'.
> +dg-init
> +
> +# Main loop.
> +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\] ]] \
> +       "" $DEFAULT_CFLAGS
> +
> +# All done.
> +dg-finish
> diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp
> index c7722ba07da..51d8a11f878 100644
> --- a/gcc/testsuite/lib/gcc-dg.exp
> +++ b/gcc/testsuite/lib/gcc-dg.exp
> @@ -621,6 +621,22 @@ proc gcc-dg-runtest { testcases flags default-extra-flags } {
>      }
>  }
>
> +# Check if frontend has CTF support
> +proc gcc-dg-frontend-supports-ctf { target_compile trivial } {
> +    global srcdir subdir
> +
> +    set comp_output [$target_compile \
> +           "$srcdir/$subdir/$trivial" "trivial.S" assembly \
> +           "additional_flags=-gctf"]
> +    if { ! [string match \
> +           "*CTF debug info requested, but not supported for * frontend*" \
> +           $comp_output] } {
> +       remove-build-file "trivial.S"
> +       return 1
> +    }
> +    return 0
> +}
> +
>  # Check if the target system supports the debug format
>  proc gcc-dg-target-supports-debug-format { target_compile trivial type } {
>      global srcdir subdir
> @@ -639,21 +655,30 @@ proc gcc-dg-target-supports-debug-format { target_compile trivial type } {
>  proc gcc-dg-debug-runtest { target_compile trivial opt_opts testcases } {
>      if ![info exists DEBUG_TORTURE_OPTIONS] {
>         set DEBUG_TORTURE_OPTIONS ""
> -       foreach type {-gdwarf-2 -gstabs -gstabs+ -gxcoff -gxcoff+} {
> -           if [expr [gcc-dg-target-supports-debug-format \
> -                     $target_compile $trivial $type]] {
> -               foreach level {1 "" 3} {
> -                   if { ($type == "-gdwarf-2") && ($level != "") } {
> -                       lappend DEBUG_TORTURE_OPTIONS [list "${type}" "-g${level}"]
> -                       foreach opt $opt_opts {
> -                           lappend DEBUG_TORTURE_OPTIONS \
> -                                   [list "${type}" "-g${level}" "$opt" ]
> -                       }
> -                   } else {
> -                       lappend DEBUG_TORTURE_OPTIONS [list "${type}${level}"]
> -                       foreach opt $opt_opts {
> -                           lappend DEBUG_TORTURE_OPTIONS \
> -                                   [list "${type}${level}" "$opt" ]
> +       foreach type {-gctf -gdwarf-2 -gstabs -gstabs+ -gxcoff -gxcoff+} {
> +           if { $type == "-gctf" } {
> +               if [expr [gcc-dg-frontend-supports-ctf \
> +                         $target_compile $trivial]] {
> +                   # At this time, running tests with various opt levels or
> +                   # ctf debug info levels does not add value.
> +                   lappend DEBUG_TORTURE_OPTIONS  [list "${type}"]
> +               }
> +           } else {
> +               if [expr [gcc-dg-target-supports-debug-format \
> +                         $target_compile $trivial $type]] {
> +                   foreach level {1 "" 3} {
> +                       if { ($type == "-gdwarf-2") && ($level != "") } {
> +                           lappend DEBUG_TORTURE_OPTIONS [list "${type}" "-g${level}"]
> +                           foreach opt $opt_opts {
> +                               lappend DEBUG_TORTURE_OPTIONS \
> +                                       [list "${type}" "-g${level}" "$opt" ]
> +                           }
> +                       } else {
> +                           lappend DEBUG_TORTURE_OPTIONS [list "${type}${level}"]
> +                           foreach opt $opt_opts {
> +                               lappend DEBUG_TORTURE_OPTIONS \
> +                                       [list "${type}${level}" "$opt" ]
> +                           }
>                         }
>                     }
>                 }
> @@ -698,6 +723,15 @@ proc gcc-dg-debug-runtest { target_compile trivial opt_opts testcases } {
>                 set doit 0
>             }
>
> +           # These tests check for information which is not emitted for CTF
> +           # as CTF type information is emitted for entities at file and
> +           # global scope only.
> +           if { ([string match {*/debug-[126].c} "$nshort"] \
> +                 || [string match {*/enum-[12].C} "$nshort"] ) \
> +                 && [string match "*ctf*" "$flags"] } {
> +               set doit 0
> +           }
> +
>             if { $doit } {
>                 verbose -log "Testing $nshort, $flags" 1
>                 dg-test $test $flags ""
> --
> 2.25.0.2.g232378479e
>


More information about the Gcc-patches mailing list