* [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).