Patchwork GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type qualifier.

login
register
mail settings
Submitter Mark Wielaard
Date Feb. 9, 2015, 2:20 p.m.
Message ID <1423491607.4947.74.camel@bordewijk.wildebeest.org>
Download mbox | patch
Permalink /patch/4977/
State New
Headers show

Comments

Mark Wielaard - Feb. 9, 2015, 2:20 p.m.
On Mon, 2015-02-09 at 11:56 +0400, Joel Brobecker wrote:
> > > 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).

Yes, it has already been in GCC since December.

> 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").

Done.

> > +set asm_file [standard_output_file $srcfile2]
> > +#set ptr_size [get_sizeof "void *" 96]
> 
> Delete this commented out statement.

Removed. Was a copy/paste error.

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

Changed.

> > +int
> > +main()
> 
> While at it, would you mind reformatting this as:
> 
> main (void)

Done.

Thanks, pushed as attached,

Mark

Patch

From a2c2acaf15e9cc40bae8a6eebba78aadd3a31b8e Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mjw@redhat.com>
Date: Mon, 9 Feb 2015 14:58:25 +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 | 89 ++++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.dwarf2/atomic.c        | 34 ++++++++++++
 include/ChangeLog                        |  4 ++
 include/dwarf2.def                       |  2 +
 10 files changed, 216 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 dedbb70..7b989d8 100644

--- a/gdb/ChangeLog

+++ b/gdb/ChangeLog

@@ -1,3 +1,16 @@ 

+2015-02-09  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-02-09  Markus Metzger  <markus.t.metzger@intel.com>
 
 	* btrace.c (ftrace_find_call): Skip gaps.
diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c

index 5a1b25f..64279c8 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 0d8026f..f7b9b90 100644

--- a/gdb/dwarf2read.c

+++ b/gdb/dwarf2read.c

@@ -14344,6 +14344,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
@@ -18869,6 +18887,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 140fc6f..2abaffe 100644

--- a/gdb/gdbtypes.c

+++ b/gdb/gdbtypes.c

@@ -714,6 +714,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.
@@ -4012,6 +4023,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 7ca44f0..ef6d92c 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).
@@ -1656,6 +1663,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 4df5ba9..4fe771e 100644

--- a/gdb/testsuite/ChangeLog

+++ b/gdb/testsuite/ChangeLog

@@ -1,3 +1,8 @@ 

+2015-02-09  Mark Wielaard  <mjw@redhat.com>

+

+	* gdb.dwarf2/atomic.c: New file.

+	* gdb.dwarf2/atomic-type.exp: Likewise.

+

 2015-02-09  Markus Metzger  <markus.t.metzger@intel.com>
 
 	* gdb.btrace/buffer-size.exp: Update "info record" output.
diff --git a/gdb/testsuite/gdb.dwarf2/atomic-type.exp b/gdb/testsuite/gdb.dwarf2/atomic-type.exp

new file mode 100644
index 0000000..fb315e3

--- /dev/null

+++ b/gdb/testsuite/gdb.dwarf2/atomic-type.exp

@@ -0,0 +1,89 @@ 

+# Copyright 2014, 2015 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]

+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..3553cdf

--- /dev/null

+++ b/gdb/testsuite/gdb.dwarf2/atomic.c

@@ -0,0 +1,34 @@ 

+/* This testcase is part of GDB, the GNU debugger.

+

+   Copyright 2004-2015 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 (void)

+{

+  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 16dc84a..4004997 100644

--- a/include/ChangeLog

+++ b/include/ChangeLog

@@ -1,3 +1,7 @@ 

+2015-02-09  Mark Wielaard  <mjw@redhat.com>

+

+	* dwarf2.def: Add DW_TAG_atomic_type.

+

 2015-01-28  James Bowman  <james.bowman@ftdichip.com>
 
 	* dis-asm.h (print_insn_ft32): Declare.
diff --git a/include/dwarf2.def b/include/dwarf2.def

index 3aecdfc..e61cfbe 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