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.bha...@oracle.com> > David Faust <david.fa...@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 >