This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] DWARFv5 Emit DW_TAG_atomic_type for C11 _Atomic.
- From: Mark Wielaard <mjw at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: jason at redhat dot com, ccoutant at google dot com, jakub at redhat dot com, aldyh at redhat dot com, arnez at linux dot vnet dot ibm dot com, joseph at codesourcery dot com, Mark Wielaard <mjw at redhat dot com>
- Date: Mon, 8 Dec 2014 15:30:01 +0100
- Subject: [PATCH] DWARFv5 Emit DW_TAG_atomic_type for C11 _Atomic.
- Authentication-results: sourceware.org; auth=none
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
This is much simpler than my previous patch. Thanks to Andreas cleanups
for PR 63300 adding new qualifier support to dwarf2out.c is almost trivial.
Now that we have experimental -gdwarf-5 support we can emit this new TAG
just when the user explictly asks for it.
I do have a corresponding GDB patch to take advantage of the new information.
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.
---
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 b2eb950..b2fe45c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-12-08 Mark Wielaard <mjw@redhat.com>
+
+ PR debug/60782
+ * dwarf2out.c (modified_type_die): Handle TYPE_QUAL_ATOMIC.
+
2014-12-02 Dmitry Vyukov <dvyukov@google.com>
* asan.c: (asan_finish_file): Use default priority for constructors
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index ca1e3ef..34b327e 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 f2e54ef..e983a07 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-08 Mark Wielaard <mjw@redhat.com>
+
+ PR debug/60782
+ * gcc.dg/debug/dwarf2/atomic.c: New test.
+ * gcc.dg/debug/dwarf2/stacked-qualified-types-3.c: Likewise.
+
2014-12-02 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/avx512ifma-vpmaddhuq-2.c: Define AVX512IFMA.
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 0000000..187e695
--- /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 0000000..efa3fa0
--- /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 e0baca9..632420c 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2014-12-08 Mark Wielaard <mjw@redhat.com>
+
+ PR debug/60782
+ * dwarf2.def: Add DWARFv5 DW_TAG_atomic_type.
+
2014-11-21 Mark Wielaard <mjw@redhat.com>
* dwarf2.h: Add DW_LANG_C_plus_plus_11, DW_LANG_C11 and
diff --git a/include/dwarf2.def b/include/dwarf2.def
index 8533a3e..ea8127c 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)
--
1.8.3.1