GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type qualifier.

Message ID 1421395212.26117.32.camel@bordewijk.wildebeest.org
State New, archived
Headers

Commit Message

Mark Wielaard Jan. 16, 2015, 8 a.m. UTC
  On Tue, 2014-12-09 at 23:30 +0100, Mark Wielaard wrote:
> This is a cleanup version of the prototype we discussed 6 months ago.
> https://sourceware.org/ml/gdb-patches/2014-06/msg00795.html
> GCC now has support for DW_TAG_atomic_type when using the experimental
> -gdwarf-5 flag. I fixed up the issues Tom pointed out back in June.
> And I changed the testcase to use the DWARF assembler.
> 
> gdb/ChangeLog
> 
> 	* c-typeprint.c (cp_type_print_method_args): Handle '_Atomic'.
> 	(c_type_print_modifier): Likewise.
> 	* dwarf2read.c (read_tag_atomic_type): New function.
> 	(read_type_die_1): Handle DW_TAG_atomic_type.
> 	* gdbtypes.c (make_atomic_type): New function.
> 	(recursive_dump_type): Handle TYPE_ATOMIC.
> 	* gdbtypes.h (enum type_flag_values): Renumber.
> 	(enum type_instance_flag_value): Add TYPE_INSTANCE_FLAG_ATOMIC.
> 	(TYPE_ATOMIC): New macro.
> 	(make_atomic_type): Declare.
> 
> gdb/testsuite/ChangeLog
> 
> 	* gdb.dwarf2/atomic.c: New file.
> 	* gdb.dwarf2/atomic-type.exp: Likewise.
> 
> include/ChangeLog
> 
> 	* dwarf2.def: Add DW_TAG_atomic_type.
> 
> OK to commit?

Ping. Rebased version of patch attached.
  

Comments

Mark Wielaard Jan. 23, 2015, 4:38 p.m. UTC | #1
On Fri, 2015-01-16 at 09:00 +0100, Mark Wielaard wrote:
> On Tue, 2014-12-09 at 23:30 +0100, Mark Wielaard wrote:
> > This is a cleanup version of the prototype we discussed 6 months ago.
> > https://sourceware.org/ml/gdb-patches/2014-06/msg00795.html
> > GCC now has support for DW_TAG_atomic_type when using the experimental
> > -gdwarf-5 flag. I fixed up the issues Tom pointed out back in June.
> > And I changed the testcase to use the DWARF assembler.
> > 
> > gdb/ChangeLog
> > 
> > 	* c-typeprint.c (cp_type_print_method_args): Handle '_Atomic'.
> > 	(c_type_print_modifier): Likewise.
> > 	* dwarf2read.c (read_tag_atomic_type): New function.
> > 	(read_type_die_1): Handle DW_TAG_atomic_type.
> > 	* gdbtypes.c (make_atomic_type): New function.
> > 	(recursive_dump_type): Handle TYPE_ATOMIC.
> > 	* gdbtypes.h (enum type_flag_values): Renumber.
> > 	(enum type_instance_flag_value): Add TYPE_INSTANCE_FLAG_ATOMIC.
> > 	(TYPE_ATOMIC): New macro.
> > 	(make_atomic_type): Declare.
> > 
> > gdb/testsuite/ChangeLog
> > 
> > 	* gdb.dwarf2/atomic.c: New file.
> > 	* gdb.dwarf2/atomic-type.exp: Likewise.
> > 
> > include/ChangeLog
> > 
> > 	* dwarf2.def: Add DW_TAG_atomic_type.
> > 
> > OK to commit?
> 
> Ping. Rebased version of patch attached.

Ping?
  
Mark Wielaard Feb. 4, 2015, 7:49 p.m. UTC | #2
On Fri, 2015-01-23 at 17:38 +0100, Mark Wielaard wrote:
> On Fri, 2015-01-16 at 09:00 +0100, Mark Wielaard wrote:
> > On Tue, 2014-12-09 at 23:30 +0100, Mark Wielaard wrote:
> > > This is a cleanup version of the prototype we discussed 6 months ago.
> > > https://sourceware.org/ml/gdb-patches/2014-06/msg00795.html
> > > GCC now has support for DW_TAG_atomic_type when using the experimental
> > > -gdwarf-5 flag. I fixed up the issues Tom pointed out back in June.
> > > And I changed the testcase to use the DWARF assembler.
> > > 
> > > gdb/ChangeLog
> > > 
> > > 	* c-typeprint.c (cp_type_print_method_args): Handle '_Atomic'.
> > > 	(c_type_print_modifier): Likewise.
> > > 	* dwarf2read.c (read_tag_atomic_type): New function.
> > > 	(read_type_die_1): Handle DW_TAG_atomic_type.
> > > 	* gdbtypes.c (make_atomic_type): New function.
> > > 	(recursive_dump_type): Handle TYPE_ATOMIC.
> > > 	* gdbtypes.h (enum type_flag_values): Renumber.
> > > 	(enum type_instance_flag_value): Add TYPE_INSTANCE_FLAG_ATOMIC.
> > > 	(TYPE_ATOMIC): New macro.
> > > 	(make_atomic_type): Declare.
> > > 
> > > gdb/testsuite/ChangeLog
> > > 
> > > 	* gdb.dwarf2/atomic.c: New file.
> > > 	* gdb.dwarf2/atomic-type.exp: Likewise.
> > > 
> > > include/ChangeLog
> > > 
> > > 	* dwarf2.def: Add DW_TAG_atomic_type.
> > > 
> > > OK to commit?
> > 
> > Ping. Rebased version of patch attached.
> 
> Ping?

Ping!
  
Joel Brobecker Feb. 9, 2015, 7:56 a.m. UTC | #3
Sorry about the delay in reviewing this.

> > This is a cleanup version of the prototype we discussed 6 months ago.
> > https://sourceware.org/ml/gdb-patches/2014-06/msg00795.html
> > GCC now has support for DW_TAG_atomic_type when using the experimental
> > -gdwarf-5 flag. I fixed up the issues Tom pointed out back in June.
> > And I changed the testcase to use the DWARF assembler.

> > gdb/ChangeLog
> > 
> > 	* c-typeprint.c (cp_type_print_method_args): Handle '_Atomic'.
> > 	(c_type_print_modifier): Likewise.
> > 	* dwarf2read.c (read_tag_atomic_type): New function.
> > 	(read_type_die_1): Handle DW_TAG_atomic_type.
> > 	* gdbtypes.c (make_atomic_type): New function.
> > 	(recursive_dump_type): Handle TYPE_ATOMIC.
> > 	* gdbtypes.h (enum type_flag_values): Renumber.
> > 	(enum type_instance_flag_value): Add TYPE_INSTANCE_FLAG_ATOMIC.
> > 	(TYPE_ATOMIC): New macro.
> > 	(make_atomic_type): Declare.
> > 
> > gdb/testsuite/ChangeLog
> > 
> > 	* gdb.dwarf2/atomic.c: New file.
> > 	* gdb.dwarf2/atomic-type.exp: Likewise.
> > 
> > include/ChangeLog
> > 
> > 	* dwarf2.def: Add DW_TAG_atomic_type.

The part in include is controlled by GCC. As soon as approved there,
it is OK to propagate the change to binutils-gdb.git as well (just
shooting us an email, as if applying an "obvious" patch).

Note that I went to the DWARF website, and verified that this new
tag has been accepted with 0x47 as its value (as proposed here).

Looks good to me, with a couple of slight nits (our faults, I'm afraid,
but fortunately trivially fixed).
> +++ b/gdb/testsuite/gdb.dwarf2/atomic-type.exp
> @@ -0,0 +1,90 @@
> +# Copyright 2014 Free Software Foundation, Inc.

Need to add 2015 to the list (that is: "2014-2015").

> +set asm_file [standard_output_file $srcfile2]
> +#set ptr_size [get_sizeof "void *" 96]

Delete this commented out statement.

> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2004-2014 Free Software Foundation, Inc.

s/2014/2015/.

> +int
> +main()

While at it, would you mind reformatting this as:

main (void)

? There was a decision not too long ago that we'd try to have
the code in our testsuite try to conform to the GCS unless there
was reason not to.


Thank you,
  

Patch

From 16ef515042cdb56da9f8de07c4d2ab77f53681be Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mjw@redhat.com>
Date: Tue, 9 Dec 2014 23:12:55 +0100
Subject: [PATCH] GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type
 qualifier.

gdb/ChangeLog

	* c-typeprint.c (cp_type_print_method_args): Handle '_Atomic'.
	(c_type_print_modifier): Likewise.
	* dwarf2read.c (read_tag_atomic_type): New function.
	(read_type_die_1): Handle DW_TAG_atomic_type.
	* gdbtypes.c (make_atomic_type): New function.
	(recursive_dump_type): Handle TYPE_ATOMIC.
	* gdbtypes.h (enum type_flag_values): Renumber.
	(enum type_instance_flag_value): Add TYPE_INSTANCE_FLAG_ATOMIC.
	(TYPE_ATOMIC): New macro.
	(make_atomic_type): Declare.

gdb/testsuite/ChangeLog

	* gdb.dwarf2/atomic.c: New file.
	* gdb.dwarf2/atomic-type.exp: Likewise.

include/ChangeLog

	* dwarf2.def: Add DW_TAG_atomic_type.
---
 gdb/ChangeLog                            | 13 +++++
 gdb/c-typeprint.c                        | 11 ++++
 gdb/dwarf2read.c                         | 21 ++++++++
 gdb/gdbtypes.c                           | 15 ++++++
 gdb/gdbtypes.h                           | 35 ++++++++-----
 gdb/testsuite/ChangeLog                  |  5 ++
 gdb/testsuite/gdb.dwarf2/atomic-type.exp | 90 ++++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.dwarf2/atomic.c        | 34 ++++++++++++
 include/ChangeLog                        |  4 ++
 include/dwarf2.def                       |  2 +
 10 files changed, 217 insertions(+), 13 deletions(-)
 create mode 100644 gdb/testsuite/gdb.dwarf2/atomic-type.exp
 create mode 100644 gdb/testsuite/gdb.dwarf2/atomic.c

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5c45780..7301174 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,16 @@ 
+2015-01-16  Mark Wielaard  <mjw@redhat.com>
+
+	* c-typeprint.c (cp_type_print_method_args): Handle '_Atomic'.
+	(c_type_print_modifier): Likewise.
+	* dwarf2read.c (read_tag_atomic_type): New function.
+	(read_type_die_1): Handle DW_TAG_atomic_type.
+	* gdbtypes.c (make_atomic_type): New function.
+	(recursive_dump_type): Handle TYPE_ATOMIC.
+	* gdbtypes.h (enum type_flag_values): Renumber.
+	(enum type_instance_flag_value): Add TYPE_INSTANCE_FLAG_ATOMIC.
+	(TYPE_ATOMIC): New macro.
+	(make_atomic_type): Declare.
+
 2015-01-15  Joel Brobecker  <brobecker@adacore.com>
 
 	GDB 7.8.2 released.
diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c
index c94534e..bbe4827 100644
--- a/gdb/c-typeprint.c
+++ b/gdb/c-typeprint.c
@@ -270,6 +270,9 @@  cp_type_print_method_args (struct type *mtype, const char *prefix,
 
       if (TYPE_RESTRICT (domain))
 	fprintf_filtered (stream, " restrict");
+
+      if (TYPE_ATOMIC (domain))
+	fprintf_filtered (stream, " _Atomic");
     }
 }
 
@@ -431,6 +434,14 @@  c_type_print_modifier (struct type *type, struct ui_file *stream,
       did_print_modifier = 1;
     }
 
+  if (TYPE_ATOMIC (type))
+    {
+      if (did_print_modifier || need_pre_space)
+	fprintf_filtered (stream, " ");
+      fprintf_filtered (stream, "_Atomic");
+      did_print_modifier = 1;
+    }
+
   address_space_id = address_space_int_to_name (get_type_arch (type),
 						TYPE_INSTANCE_FLAGS (type));
   if (address_space_id)
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 96b2537..80a5c2e 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -14229,6 +14229,24 @@  read_tag_restrict_type (struct die_info *die, struct dwarf2_cu *cu)
   return set_die_type (die, cv_type, cu);
 }
 
+/* Handle DW_TAG_atomic_type.  */
+
+static struct type *
+read_tag_atomic_type (struct die_info *die, struct dwarf2_cu *cu)
+{
+  struct type *base_type, *cv_type;
+
+  base_type = die_type (die, cu);
+
+  /* The die_type call above may have already set the type for this DIE.  */
+  cv_type = get_die_type (die, cu);
+  if (cv_type)
+    return cv_type;
+
+  cv_type = make_atomic_type (base_type);
+  return set_die_type (die, cv_type, cu);
+}
+
 /* Extract all information from a DW_TAG_string_type DIE and add to
    the user defined type vector.  It isn't really a user defined type,
    but it behaves like one, with other DIE's using an AT_user_def_type
@@ -18695,6 +18713,9 @@  read_type_die_1 (struct die_info *die, struct dwarf2_cu *cu)
     case DW_TAG_module:
       this_type = read_module_type (die, cu);
       break;
+    case DW_TAG_atomic_type:
+      this_type = read_tag_atomic_type (die, cu);
+      break;
     default:
       complaint (&symfile_complaints,
 		 _("unexpected tag in read_type_die: '%s'"),
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 6d3c084..339d686 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -716,6 +716,17 @@  make_unqualified_type (struct type *type)
 			      NULL);
 }
 
+/* Make a '_Atomic'-qualified version of TYPE.  */
+
+struct type *
+make_atomic_type (struct type *type)
+{
+  return make_qualified_type (type,
+			      (TYPE_INSTANCE_FLAGS (type)
+			       | TYPE_INSTANCE_FLAG_ATOMIC),
+			      NULL);
+}
+
 /* Replace the contents of ntype with the type *type.  This changes the
    contents, rather than the pointer for TYPE_MAIN_TYPE (ntype); thus
    the changes are propogated to all types in the TYPE_CHAIN.
@@ -3872,6 +3883,10 @@  recursive_dump_type (struct type *type, int spaces)
     {
       puts_filtered (" TYPE_FLAG_RESTRICT");
     }
+  if (TYPE_ATOMIC (type))
+    {
+      puts_filtered (" TYPE_FLAG_ATOMIC");
+    }
   puts_filtered ("\n");
 
   printfi_filtered (spaces, "flags");
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 7c06a4f..3e01c5e 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -193,18 +193,18 @@  enum type_code
 
 enum type_flag_value
 {
-  TYPE_FLAG_UNSIGNED = (1 << 8),
-  TYPE_FLAG_NOSIGN = (1 << 9),
-  TYPE_FLAG_STUB = (1 << 10),
-  TYPE_FLAG_TARGET_STUB = (1 << 11),
-  TYPE_FLAG_STATIC = (1 << 12),
-  TYPE_FLAG_PROTOTYPED = (1 << 13),
-  TYPE_FLAG_INCOMPLETE = (1 << 14),
-  TYPE_FLAG_VARARGS = (1 << 15),
-  TYPE_FLAG_VECTOR = (1 << 16),
-  TYPE_FLAG_FIXED_INSTANCE = (1 << 17),
-  TYPE_FLAG_STUB_SUPPORTED = (1 << 18),
-  TYPE_FLAG_GNU_IFUNC = (1 << 19),
+  TYPE_FLAG_UNSIGNED = (1 << 9),
+  TYPE_FLAG_NOSIGN = (1 << 10),
+  TYPE_FLAG_STUB = (1 << 11),
+  TYPE_FLAG_TARGET_STUB = (1 << 12),
+  TYPE_FLAG_STATIC = (1 << 13),
+  TYPE_FLAG_PROTOTYPED = (1 << 14),
+  TYPE_FLAG_INCOMPLETE = (1 << 15),
+  TYPE_FLAG_VARARGS = (1 << 16),
+  TYPE_FLAG_VECTOR = (1 << 17),
+  TYPE_FLAG_FIXED_INSTANCE = (1 << 18),
+  TYPE_FLAG_STUB_SUPPORTED = (1 << 19),
+  TYPE_FLAG_GNU_IFUNC = (1 << 20),
 
   /* * Used for error-checking.  */
   TYPE_FLAG_MIN = TYPE_FLAG_UNSIGNED
@@ -223,7 +223,8 @@  enum type_instance_flag_value
   TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1 = (1 << 4),
   TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2 = (1 << 5),
   TYPE_INSTANCE_FLAG_NOTTEXT = (1 << 6),
-  TYPE_INSTANCE_FLAG_RESTRICT = (1 << 7)
+  TYPE_INSTANCE_FLAG_RESTRICT = (1 << 7),
+  TYPE_INSTANCE_FLAG_ATOMIC = (1 << 8)
 };
 
 /* * Unsigned integer type.  If this is not set for a TYPE_CODE_INT,
@@ -355,6 +356,12 @@  enum type_instance_flag_value
 #define TYPE_RESTRICT(t) \
   (TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_RESTRICT)
 
+/* * Atomic type.  If this is set, the corresponding type has an
+   _Atomic modifier.  */
+
+#define TYPE_ATOMIC(t) \
+  (TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_ATOMIC)
+
 /* * Instruction-space delimited type.  This is for Harvard architectures
    which have separate instruction and data address spaces (and perhaps
    others).
@@ -1634,6 +1641,8 @@  extern struct type *make_restrict_type (struct type *);
 
 extern struct type *make_unqualified_type (struct type *);
 
+extern struct type *make_atomic_type (struct type *);
+
 extern void replace_type (struct type *, struct type *);
 
 extern int address_space_name_to_int (struct gdbarch *, char *);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index a71ee98..dc92069 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@ 
+2015-01-16  Mark Wielaard  <mjw@redhat.com>
+
+	* gdb.dwarf2/atomic.c: New file.
+	* gdb.dwarf2/atomic-type.exp: Likewise.
+
 2015-01-15  Joel Brobecker  <brobecker@adacore.com>
 
 	* gdb.ada/var_arr_attrs: New testcase.
diff --git a/gdb/testsuite/gdb.dwarf2/atomic-type.exp b/gdb/testsuite/gdb.dwarf2/atomic-type.exp
new file mode 100644
index 0000000..d7c3bbe
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/atomic-type.exp
@@ -0,0 +1,90 @@ 
+# Copyright 2014 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+    return 0
+}
+
+standard_testfile atomic.c atomic-type-dw.S
+
+# Make some DWARF for the test.
+
+set asm_file [standard_output_file $srcfile2]
+#set ptr_size [get_sizeof "void *" 96]
+Dwarf::assemble $asm_file {
+    cu {} {
+	DW_TAG_compile_unit {
+                {DW_AT_language @DW_LANG_C11}
+                {DW_AT_name     atomic-type-dw.c}
+                {DW_AT_comp_dir /tmp}
+        } {
+	    declare_labels i_l c_l c_c_l ac_c_l pac_c_l vpac_c_l avpac_c_l
+
+            i_l: DW_TAG_base_type {
+                {DW_AT_byte_size 4 DW_FORM_sdata}
+                {DW_AT_encoding  @DW_ATE_signed}
+                {DW_AT_name      int}
+            }
+
+            c_l: DW_TAG_base_type {
+                {DW_AT_byte_size 2 DW_FORM_sdata}
+                {DW_AT_encoding  @DW_ATE_unsigned}
+                {DW_AT_name      char}
+            }
+
+            c_c_l: DW_TAG_const_type {
+                {DW_AT_type :$c_l}
+            }
+
+            ac_c_l: DW_TAG_atomic_type {
+                {DW_AT_type :$c_c_l}
+            }
+
+            pac_c_l: DW_TAG_pointer_type {
+                {DW_AT_byte_size 8 DW_FORM_sdata}
+                {DW_AT_type :$ac_c_l}
+            }
+
+            vpac_c_l: DW_TAG_volatile_type {
+                {DW_AT_type :$pac_c_l}
+            }
+
+            avpac_c_l: DW_TAG_atomic_type {
+                {DW_AT_type :$vpac_c_l}
+            }
+
+            DW_TAG_subprogram {
+                {name f}
+                {low_pc f addr}
+                {high_pc f_end_lbl addr}
+                {type :$i_l}
+            } {
+                DW_TAG_formal_parameter {
+                    {type :$avpac_c_l}
+                    {name x}
+                }
+            }
+	}
+    }
+}
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} \
+	  [list $srcfile $asm_file] {nodebug}] } {
+    return -1
+}
+
+gdb_test "ptype f" "int \\(const _Atomic char \\\* volatile _Atomic\\)"
diff --git a/gdb/testsuite/gdb.dwarf2/atomic.c b/gdb/testsuite/gdb.dwarf2/atomic.c
new file mode 100644
index 0000000..6ebb9ca
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/atomic.c
@@ -0,0 +1,34 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2004-2014 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Dummy main function.  */
+
+int
+main()
+{
+  asm ("main_label: .globl main_label");
+  return 0;
+}
+
+/* dummy f function, DWARF will describe arguments and type differently.  */
+int
+f (char *x)
+{
+  asm (".global f_end_lbl\nf_end_lbl:");
+  return 0;
+}
+
diff --git a/include/ChangeLog b/include/ChangeLog
index 31f1e18..59965e2 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,7 @@ 
+2015-01-16  Mark Wielaard  <mjw@redhat.com>
+
+	* dwarf2.def: Add DW_TAG_atomic_type.
+
 2015-01-14  Jan-Benedict Glaw  <jbglaw@lug-owl.de>
 
 	* libiberty.h: Merge from GCC.
diff --git a/include/dwarf2.def b/include/dwarf2.def
index 5da3ae0..c759e69 100644
--- a/include/dwarf2.def
+++ b/include/dwarf2.def
@@ -131,6 +131,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