This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]