handle DW_AT_type on an enumeration

DWARF allows an enumeration type to have a DW_AT_type.  GDB doesn't
recognize this, but there is a patch to change GCC to emit it, and a
DWARF proposal to further allow an enum type with a DW_AT_type to omit
the DW_AT_byte_size.  This patch changes gdb to implement this.

Built and regtested on x86-64 Fedora 20.

2014-04-14  Tom Tromey  <tromey@redhat.com>

	* dwarf2read.c (read_enumeration_type): Handle DW_AT_type.

2014-04-14  Tom Tromey  <tromey@redhat.com>

	* gdb.dwarf2/enum-type.exp: New file.
This commit is contained in:
Tom Tromey 2014-03-26 08:54:56 -06:00
parent dca325b370
commit 0626fc76d1
4 changed files with 93 additions and 1 deletions

View File

@ -1,3 +1,7 @@
2014-04-14 Tom Tromey <tromey@redhat.com>
* dwarf2read.c (read_enumeration_type): Handle DW_AT_type.
2014-04-14 Sanimir Agovic <sanimir.agovic@intel.com>
* eval.c (evaluate_subexp_for_sizeof): Add enum noside argument.

View File

@ -13225,6 +13225,14 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu)
if (name != NULL)
TYPE_TAG_NAME (type) = name;
attr = dwarf2_attr (die, DW_AT_type, cu);
if (attr != NULL)
{
struct type *underlying_type = die_type (die, cu);
TYPE_TARGET_TYPE (type) = underlying_type;
}
attr = dwarf2_attr (die, DW_AT_byte_size, cu);
if (attr)
{
@ -13243,9 +13251,25 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu)
if (die_is_declaration (die, cu))
TYPE_STUB (type) = 1;
/* Finish the creation of this type by using the enum's children. */
/* Finish the creation of this type by using the enum's children.
We must call this even when the underlying type has been provided
so that we can determine if we're looking at a "flag" enum. */
update_enumeration_type_from_children (die, type, cu);
/* If this type has an underlying type that is not a stub, then we
may use its attributes. We always use the "unsigned" attribute
in this situation, because ordinarily we guess whether the type
is unsigned -- but the guess can be wrong and the underlying type
can tell us the reality. However, we defer to a local size
attribute if one exists, because this lets the compiler override
the underlying type if needed. */
if (TYPE_TARGET_TYPE (type) != NULL && !TYPE_STUB (TYPE_TARGET_TYPE (type)))
{
TYPE_UNSIGNED (type) = TYPE_UNSIGNED (TYPE_TARGET_TYPE (type));
if (TYPE_LENGTH (type) == 0)
TYPE_LENGTH (type) = TYPE_LENGTH (TYPE_TARGET_TYPE (type));
}
return set_die_type (die, type, cu);
}

View File

@ -1,3 +1,7 @@
2014-04-14 Tom Tromey <tromey@redhat.com>
* gdb.dwarf2/enum-type.exp: New file.
2014-04-14 Sanimir Agovic <sanimir.agovic@intel.com>
* gdb.mi/mi-vla-c99.exp: New file.

View File

@ -0,0 +1,60 @@
# 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 main.c enum-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_C}
{DW_AT_name enum-type-dw.c}
{DW_AT_comp_dir /tmp}
} {
declare_labels integer_label array_elt_label array_label \
big_array_label
integer_label: DW_TAG_base_type {
{DW_AT_byte_size 4 DW_FORM_sdata}
{DW_AT_encoding @DW_ATE_signed}
{DW_AT_name integer}
}
DW_TAG_enumeration_type {
{DW_AT_name E}
{DW_AT_type :$integer_label}
} {
DW_TAG_enumerator {
{DW_AT_name ONE}
{DW_AT_const_value 1}
}
}
}
}
}
if { [prepare_for_testing ${testfile}.exp ${testfile} \
[list $srcfile $asm_file] {nodebug}] } {
return -1
}
gdb_test "print sizeof(enum E)" " = 4"