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.
This commit is contained in:
parent
e051a5b512
commit
a2c2acaf15
10 changed files with 216 additions and 13 deletions
|
@ -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>
|
2015-02-09 Markus Metzger <markus.t.metzger@intel.com>
|
||||||
|
|
||||||
* btrace.c (ftrace_find_call): Skip gaps.
|
* btrace.c (ftrace_find_call): Skip gaps.
|
||||||
|
|
|
@ -270,6 +270,9 @@ cp_type_print_method_args (struct type *mtype, const char *prefix,
|
||||||
|
|
||||||
if (TYPE_RESTRICT (domain))
|
if (TYPE_RESTRICT (domain))
|
||||||
fprintf_filtered (stream, " restrict");
|
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;
|
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),
|
address_space_id = address_space_int_to_name (get_type_arch (type),
|
||||||
TYPE_INSTANCE_FLAGS (type));
|
TYPE_INSTANCE_FLAGS (type));
|
||||||
if (address_space_id)
|
if (address_space_id)
|
||||||
|
|
|
@ -14344,6 +14344,24 @@ read_tag_restrict_type (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
return set_die_type (die, cv_type, 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
|
/* 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,
|
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
|
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:
|
case DW_TAG_module:
|
||||||
this_type = read_module_type (die, cu);
|
this_type = read_module_type (die, cu);
|
||||||
break;
|
break;
|
||||||
|
case DW_TAG_atomic_type:
|
||||||
|
this_type = read_tag_atomic_type (die, cu);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
complaint (&symfile_complaints,
|
complaint (&symfile_complaints,
|
||||||
_("unexpected tag in read_type_die: '%s'"),
|
_("unexpected tag in read_type_die: '%s'"),
|
||||||
|
|
|
@ -714,6 +714,17 @@ make_unqualified_type (struct type *type)
|
||||||
NULL);
|
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
|
/* Replace the contents of ntype with the type *type. This changes the
|
||||||
contents, rather than the pointer for TYPE_MAIN_TYPE (ntype); thus
|
contents, rather than the pointer for TYPE_MAIN_TYPE (ntype); thus
|
||||||
the changes are propogated to all types in the TYPE_CHAIN.
|
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");
|
puts_filtered (" TYPE_FLAG_RESTRICT");
|
||||||
}
|
}
|
||||||
|
if (TYPE_ATOMIC (type))
|
||||||
|
{
|
||||||
|
puts_filtered (" TYPE_FLAG_ATOMIC");
|
||||||
|
}
|
||||||
puts_filtered ("\n");
|
puts_filtered ("\n");
|
||||||
|
|
||||||
printfi_filtered (spaces, "flags");
|
printfi_filtered (spaces, "flags");
|
||||||
|
|
|
@ -193,18 +193,18 @@ enum type_code
|
||||||
|
|
||||||
enum type_flag_value
|
enum type_flag_value
|
||||||
{
|
{
|
||||||
TYPE_FLAG_UNSIGNED = (1 << 8),
|
TYPE_FLAG_UNSIGNED = (1 << 9),
|
||||||
TYPE_FLAG_NOSIGN = (1 << 9),
|
TYPE_FLAG_NOSIGN = (1 << 10),
|
||||||
TYPE_FLAG_STUB = (1 << 10),
|
TYPE_FLAG_STUB = (1 << 11),
|
||||||
TYPE_FLAG_TARGET_STUB = (1 << 11),
|
TYPE_FLAG_TARGET_STUB = (1 << 12),
|
||||||
TYPE_FLAG_STATIC = (1 << 12),
|
TYPE_FLAG_STATIC = (1 << 13),
|
||||||
TYPE_FLAG_PROTOTYPED = (1 << 13),
|
TYPE_FLAG_PROTOTYPED = (1 << 14),
|
||||||
TYPE_FLAG_INCOMPLETE = (1 << 14),
|
TYPE_FLAG_INCOMPLETE = (1 << 15),
|
||||||
TYPE_FLAG_VARARGS = (1 << 15),
|
TYPE_FLAG_VARARGS = (1 << 16),
|
||||||
TYPE_FLAG_VECTOR = (1 << 16),
|
TYPE_FLAG_VECTOR = (1 << 17),
|
||||||
TYPE_FLAG_FIXED_INSTANCE = (1 << 17),
|
TYPE_FLAG_FIXED_INSTANCE = (1 << 18),
|
||||||
TYPE_FLAG_STUB_SUPPORTED = (1 << 18),
|
TYPE_FLAG_STUB_SUPPORTED = (1 << 19),
|
||||||
TYPE_FLAG_GNU_IFUNC = (1 << 19),
|
TYPE_FLAG_GNU_IFUNC = (1 << 20),
|
||||||
|
|
||||||
/* * Used for error-checking. */
|
/* * Used for error-checking. */
|
||||||
TYPE_FLAG_MIN = TYPE_FLAG_UNSIGNED
|
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_1 = (1 << 4),
|
||||||
TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2 = (1 << 5),
|
TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2 = (1 << 5),
|
||||||
TYPE_INSTANCE_FLAG_NOTTEXT = (1 << 6),
|
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,
|
/* * 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) \
|
#define TYPE_RESTRICT(t) \
|
||||||
(TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_RESTRICT)
|
(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
|
/* * Instruction-space delimited type. This is for Harvard architectures
|
||||||
which have separate instruction and data address spaces (and perhaps
|
which have separate instruction and data address spaces (and perhaps
|
||||||
others).
|
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_unqualified_type (struct type *);
|
||||||
|
|
||||||
|
extern struct type *make_atomic_type (struct type *);
|
||||||
|
|
||||||
extern void replace_type (struct type *, struct type *);
|
extern void replace_type (struct type *, struct type *);
|
||||||
|
|
||||||
extern int address_space_name_to_int (struct gdbarch *, char *);
|
extern int address_space_name_to_int (struct gdbarch *, char *);
|
||||||
|
|
|
@ -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>
|
2015-02-09 Markus Metzger <markus.t.metzger@intel.com>
|
||||||
|
|
||||||
* gdb.btrace/buffer-size.exp: Update "info record" output.
|
* gdb.btrace/buffer-size.exp: Update "info record" output.
|
||||||
|
|
89
gdb/testsuite/gdb.dwarf2/atomic-type.exp
Normal file
89
gdb/testsuite/gdb.dwarf2/atomic-type.exp
Normal file
|
@ -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\\)"
|
34
gdb/testsuite/gdb.dwarf2/atomic.c
Normal file
34
gdb/testsuite/gdb.dwarf2/atomic.c
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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>
|
2015-01-28 James Bowman <james.bowman@ftdichip.com>
|
||||||
|
|
||||||
* dis-asm.h (print_insn_ft32): Declare.
|
* dis-asm.h (print_insn_ft32): Declare.
|
||||||
|
|
|
@ -131,6 +131,8 @@ DW_TAG (DW_TAG_shared_type, 0x40)
|
||||||
DW_TAG (DW_TAG_type_unit, 0x41)
|
DW_TAG (DW_TAG_type_unit, 0x41)
|
||||||
DW_TAG (DW_TAG_rvalue_reference_type, 0x42)
|
DW_TAG (DW_TAG_rvalue_reference_type, 0x42)
|
||||||
DW_TAG (DW_TAG_template_alias, 0x43)
|
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_lo_user, 0x4080)
|
||||||
DW_TAG_DUP (DW_TAG_hi_user, 0xffff)
|
DW_TAG_DUP (DW_TAG_hi_user, 0xffff)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue