From bc3518da23383b0e173020a46334fe22b6b67891 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 8 Dec 2014 22:32:23 +0000 Subject: [PATCH] DWARFv5 Emit DW_TAG_atomic_type for C11 _Atomic. This implements the DW_TAG_atomic_type for C11 _Atomic proposal as adopted in the latest DWARF5 draft. http://dwarfstd.org/ShowIssue.php?issue=131112.1 gcc/ChangeLog PR debug/60782 * dwarf2out.c (modified_type_die): Handle TYPE_QUAL_ATOMIC. gcc/testsuite/ChangeLog PR debug/60782 * gcc.dg/debug/dwarf2/atomic.c: New test. * gcc.dg/debug/dwarf2/stacked-qualified-types-3.c: Likewise. include/ChangeLog PR debug/60782 * dwarf2.def: Add DWARFv5 DW_TAG_atomic_type. From-SVN: r218496 --- gcc/ChangeLog | 5 +++ gcc/dwarf2out.c | 7 +++- gcc/testsuite/ChangeLog | 6 ++++ gcc/testsuite/gcc.dg/debug/dwarf2/atomic.c | 15 ++++++++ .../debug/dwarf2/stacked-qualified-types-3.c | 34 +++++++++++++++++++ include/ChangeLog | 5 +++ include/dwarf2.def | 2 ++ 7 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/atomic.c create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/stacked-qualified-types-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c44fce6bc91..8e8de749a6a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-12-08 Mark Wielaard + + PR debug/60782 + * dwarf2out.c (modified_type_die): Handle TYPE_QUAL_ATOMIC. + 2014-11-15 David Wohlferd PR target/61692 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index ca1e3ef63f0..34b327e7514 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -10551,7 +10551,7 @@ modified_type_die (tree type, int cv_quals, dw_die_ref context_die) dw_die_ref mod_scope; /* Only these cv-qualifiers are currently handled. */ const int cv_qual_mask = (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE - | TYPE_QUAL_RESTRICT); + | TYPE_QUAL_RESTRICT | TYPE_QUAL_ATOMIC); if (code == ERROR_MARK) return NULL; @@ -10564,6 +10564,10 @@ modified_type_die (tree type, int cv_quals, dw_die_ref context_die) if (dwarf_version < 3) cv_quals &= ~TYPE_QUAL_RESTRICT; + /* Likewise for DW_TAG_atomic_type for DWARFv5. */ + if (dwarf_version < 5) + cv_quals &= ~TYPE_QUAL_ATOMIC; + /* See if we already have the appropriately qualified variant of this type. */ qualified_type = get_qualified_type (type, cv_quals); @@ -10625,6 +10629,7 @@ modified_type_die (tree type, int cv_quals, dw_die_ref context_die) struct qual_info { int q; enum dwarf_tag t; }; static const struct qual_info qual_info[] = { + { TYPE_QUAL_ATOMIC, DW_TAG_atomic_type }, { TYPE_QUAL_RESTRICT, DW_TAG_restrict_type }, { TYPE_QUAL_VOLATILE, DW_TAG_volatile_type }, { TYPE_QUAL_CONST, DW_TAG_const_type }, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 79963a7e3ea..08ddd7b9518 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-12-08 Mark Wielaard + + PR debug/60782 + * gcc.dg/debug/dwarf2/atomic.c: New test. + * gcc.dg/debug/dwarf2/stacked-qualified-types-3.c: Likewise. + 2014-11-15 David Wohlferd PR target/61692 diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/atomic.c b/gcc/testsuite/gcc.dg/debug/dwarf2/atomic.c new file mode 100644 index 00000000000..187e69548df --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/atomic.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c11 -gdwarf-5 -dA" } */ + +struct Atomics +{ + _Atomic(int) counter; + struct Pointer + { + _Atomic volatile char *p; + } p; +}; + +struct Atomics a; + +/* { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_atomic_type" 2 } } */ diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/stacked-qualified-types-3.c b/gcc/testsuite/gcc.dg/debug/dwarf2/stacked-qualified-types-3.c new file mode 100644 index 00000000000..efa3fa0b1f2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/stacked-qualified-types-3.c @@ -0,0 +1,34 @@ +/* make sure we don't duplicate type qualifiers unneeded. */ +/* { dg-do compile } */ +/* { dg-options "-std=c11 -gdwarf-5 -dA" } */ + +/* This should give us: + - One const type pointing to a char + - One volatile type pointing to a char + - One atomic type pointing to a char + - Either one const type pointing to the volatile type pointing to a char + or one volatile type pointing to the const type pointing to a char. + But not both. + - Either one volatile type pointing to an atomic type pointing to a char + or one atomic type pointing to a volatile type pointing to a char. + But not both. + - One restrict type pointing to a char pointer. + - One atomic type pointing to a char pointer. + - Either one restrict type pointing to an atomic type pointing to a char + pointer or one atomic type pointing to a restrict type pointing to a + char pointer. + But not both. */ + + +char a; +const char b; +volatile const char c; +volatile char d; +const volatile char e; +_Atomic char f; +_Atomic volatile char g; +char * _Atomic restrict h; +char * _Atomic i; +char * restrict j; + +/* { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_(?:const|volatile|atomic|restrict)_type" 8 } } */ diff --git a/include/ChangeLog b/include/ChangeLog index e0baca9c10d..632420c7699 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2014-12-08 Mark Wielaard + + PR debug/60782 + * dwarf2.def: Add DWARFv5 DW_TAG_atomic_type. + 2014-11-21 Mark Wielaard * dwarf2.h: Add DW_LANG_C_plus_plus_11, DW_LANG_C11 and diff --git a/include/dwarf2.def b/include/dwarf2.def index 8533a3edbd5..ea8127c8b1d 100644 --- a/include/dwarf2.def +++ b/include/dwarf2.def @@ -133,6 +133,8 @@ DW_TAG (DW_TAG_shared_type, 0x40) DW_TAG (DW_TAG_type_unit, 0x41) DW_TAG (DW_TAG_rvalue_reference_type, 0x42) DW_TAG (DW_TAG_template_alias, 0x43) +/* DWARF 5. */ +DW_TAG (DW_TAG_atomic_type, 0x47) DW_TAG_DUP (DW_TAG_lo_user, 0x4080) DW_TAG_DUP (DW_TAG_hi_user, 0xffff) -- 2.30.2