* [PATCH] GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type qualifier.
@ 2014-12-09 22:30 Mark Wielaard
2015-01-16 8:00 ` Mark Wielaard
0 siblings, 1 reply; 6+ messages in thread
From: Mark Wielaard @ 2014-12-09 22:30 UTC (permalink / raw)
To: gdb-patches; +Cc: Mark Wielaard
Hi,
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?
Thanks,
Mark
---
diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c
index 374c90e..ba5b09e 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 829611d..3cb8aee 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -14194,6 +14194,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
@@ -18635,6 +18653,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 611a0e7..a8edc04 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -703,6 +703,17 @@ make_restrict_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.
@@ -3856,6 +3867,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 a56f543..3001d6a 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).
@@ -1632,6 +1639,8 @@ extern struct type *make_cv_type (int, int, struct type *, struct type **);
extern struct type *make_restrict_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/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/dwarf2.def b/include/dwarf2.def
index 8ca143c..f75b6f5 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
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type qualifier.
2014-12-09 22:30 [PATCH] GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type qualifier Mark Wielaard
@ 2015-01-16 8:00 ` Mark Wielaard
2015-01-23 16:57 ` Mark Wielaard
2015-02-09 7:56 ` Joel Brobecker
0 siblings, 2 replies; 6+ messages in thread
From: Mark Wielaard @ 2015-01-16 8:00 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1167 bytes --]
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.
[-- Attachment #2: Type: text/x-patch, Size: 13527 bytes --]
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
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type qualifier.
2015-01-16 8:00 ` Mark Wielaard
@ 2015-01-23 16:57 ` Mark Wielaard
2015-02-04 19:50 ` PING: " Mark Wielaard
2015-02-09 7:56 ` Joel Brobecker
1 sibling, 1 reply; 6+ messages in thread
From: Mark Wielaard @ 2015-01-23 16:57 UTC (permalink / raw)
To: gdb-patches
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?
^ permalink raw reply [flat|nested] 6+ messages in thread
* PING: [PATCH] GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type qualifier.
2015-01-23 16:57 ` Mark Wielaard
@ 2015-02-04 19:50 ` Mark Wielaard
0 siblings, 0 replies; 6+ messages in thread
From: Mark Wielaard @ 2015-02-04 19:50 UTC (permalink / raw)
To: gdb-patches
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!
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type qualifier.
2015-01-16 8:00 ` Mark Wielaard
2015-01-23 16:57 ` Mark Wielaard
@ 2015-02-09 7:56 ` Joel Brobecker
2015-02-09 14:20 ` Mark Wielaard
1 sibling, 1 reply; 6+ messages in thread
From: Joel Brobecker @ 2015-02-09 7:56 UTC (permalink / raw)
To: Mark Wielaard; +Cc: gdb-patches
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,
--
Joel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type qualifier.
2015-02-09 7:56 ` Joel Brobecker
@ 2015-02-09 14:20 ` Mark Wielaard
0 siblings, 0 replies; 6+ messages in thread
From: Mark Wielaard @ 2015-02-09 14:20 UTC (permalink / raw)
To: Joel Brobecker; +Cc: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1334 bytes --]
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
[-- Attachment #2: 0001-GCC5-DWARFv5-Handle-DW_TAG_atomic_type-for-C11-_Atom.patch --]
[-- Type: text/x-patch, Size: 13561 bytes --]
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
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-02-09 14:20 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-12-09 22:30 [PATCH] GCC5/DWARFv5 Handle DW_TAG_atomic_type for C11 _Atomic type qualifier Mark Wielaard
2015-01-16 8:00 ` Mark Wielaard
2015-01-23 16:57 ` Mark Wielaard
2015-02-04 19:50 ` PING: " Mark Wielaard
2015-02-09 7:56 ` Joel Brobecker
2015-02-09 14:20 ` Mark Wielaard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).