PR c++/11702

* NEWS: Add entry.
	* dwarf2read.c (dwarf2_add_field): If DW_AT_const_value is present,
	create a symbol for the field and record the value.
	(new_symbol): Handle DW_TAG_member.
	* gdbtypes.c (field_is_static): Remove FIXME.
	* symtab.c (search_symbols): When searching for VARIABLES_DOMAIN,
	only ignore LOC_CONST symbols that are enums.

	testsuite/
	Test PR c++/11702.
	* gdb.cp/m-static.exp: Add testcase.
	* gdb.cp/m-static.h (gnu_obj_4): Add initialized static const member.
This commit is contained in:
Doug Evans 2010-06-29 16:53:10 +00:00
parent 6e70227d64
commit 254e6b9ed4
8 changed files with 68 additions and 8 deletions

View File

@ -1,5 +1,14 @@
2010-06-29 Doug Evans <dje@google.com> 2010-06-29 Doug Evans <dje@google.com>
PR gdb/11702
* NEWS: Add entry.
* dwarf2read.c (dwarf2_add_field): If DW_AT_const_value is present,
create a symbol for the field and record the value.
(new_symbol): Handle DW_TAG_member.
* gdbtypes.c (field_is_static): Remove FIXME.
* symtab.c (search_symbols): When searching for VARIABLES_DOMAIN,
only ignore LOC_CONST symbols that are enums.
* dwarf2read.c: Remove trailing whitespace. * dwarf2read.c: Remove trailing whitespace.
Delete FIELD_LOC_KIND_DWARF_BLOCK, unused. Delete FIELD_LOC_KIND_DWARF_BLOCK, unused.

View File

@ -32,6 +32,11 @@
GDB now also supports proper overload resolution for all the previously GDB now also supports proper overload resolution for all the previously
mentioned flavors of operators. mentioned flavors of operators.
** static const class members
Printing of static const class members that are initialized in the
class definition has been fixed.
* Windows Thread Information Block access. * Windows Thread Information Block access.
On Windows targets, GDB now supports displaying the Windows Thread On Windows targets, GDB now supports displaying the Windows Thread

View File

@ -4528,6 +4528,11 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
fp = &new_field->field; fp = &new_field->field;
/* NOTE: According to the dwarf standard, static data members are
indicated by having DW_AT_external.
The check here for ! die_is_declaration is historical.
This test is replicated in new_symbol. */
if (die->tag == DW_TAG_member && ! die_is_declaration (die, cu)) if (die->tag == DW_TAG_member && ! die_is_declaration (die, cu))
{ {
/* Data member other than a C++ static data member. */ /* Data member other than a C++ static data member. */
@ -4643,6 +4648,14 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
if (fieldname == NULL) if (fieldname == NULL)
return; return;
attr = dwarf2_attr (die, DW_AT_const_value, cu);
if (attr)
{
/* A static const member, not much different than an enum as far as
we're concerned, except that we can support more types. */
new_symbol (die, NULL, cu);
}
/* Get physical name. */ /* Get physical name. */
physname = (char *) dwarf2_physname (fieldname, die, cu); physname = (char *) dwarf2_physname (fieldname, die, cu);
@ -8824,6 +8837,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
BLOCK_FUNCTION from the blockvector. */ BLOCK_FUNCTION from the blockvector. */
break; break;
case DW_TAG_variable: case DW_TAG_variable:
case DW_TAG_member:
/* Compilation with minimal debug info may result in variables /* Compilation with minimal debug info may result in variables
with missing type entries. Change the misleading `void' type with missing type entries. Change the misleading `void' type
to something sensible. */ to something sensible. */
@ -8832,6 +8846,17 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
= objfile_type (objfile)->nodebug_data_symbol; = objfile_type (objfile)->nodebug_data_symbol;
attr = dwarf2_attr (die, DW_AT_const_value, cu); attr = dwarf2_attr (die, DW_AT_const_value, cu);
/* In the case of DW_TAG_member, we should only be called for
static const members. */
if (die->tag == DW_TAG_member)
{
/* NOTE: This test seems wrong according to the dwarf standard.
static data members are represented by DW_AT_external.
However, dwarf2_add_field is currently calling
die_is_declaration to check, so we do the same. */
gdb_assert (die_is_declaration (die, cu));
gdb_assert (attr);
}
if (attr) if (attr)
{ {
dwarf2_const_value (attr, sym, cu); dwarf2_const_value (attr, sym, cu);

View File

@ -2512,9 +2512,7 @@ field_is_static (struct field *f)
to the address of the enclosing struct. It would be nice to to the address of the enclosing struct. It would be nice to
have a dedicated flag that would be set for static fields when have a dedicated flag that would be set for static fields when
the type is being created. But in practice, checking the field the type is being created. But in practice, checking the field
loc_kind should give us an accurate answer (at least as long as loc_kind should give us an accurate answer. */
we assume that DWARF block locations are not going to be used
for static fields). FIXME? */
return (FIELD_LOC_KIND (*f) == FIELD_LOC_KIND_PHYSNAME return (FIELD_LOC_KIND (*f) == FIELD_LOC_KIND_PHYSNAME
|| FIELD_LOC_KIND (*f) == FIELD_LOC_KIND_PHYSADDR); || FIELD_LOC_KIND (*f) == FIELD_LOC_KIND_PHYSADDR);
} }

View File

@ -3057,10 +3057,15 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
if (file_matches (real_symtab->filename, files, nfiles) if (file_matches (real_symtab->filename, files, nfiles)
&& ((regexp == NULL && ((regexp == NULL
|| re_exec (SYMBOL_NATURAL_NAME (sym)) != 0) || re_exec (SYMBOL_NATURAL_NAME (sym)) != 0)
&& ((kind == VARIABLES_DOMAIN && SYMBOL_CLASS (sym) != LOC_TYPEDEF && ((kind == VARIABLES_DOMAIN
&& SYMBOL_CLASS (sym) != LOC_TYPEDEF
&& SYMBOL_CLASS (sym) != LOC_UNRESOLVED && SYMBOL_CLASS (sym) != LOC_UNRESOLVED
&& SYMBOL_CLASS (sym) != LOC_BLOCK && SYMBOL_CLASS (sym) != LOC_BLOCK
&& SYMBOL_CLASS (sym) != LOC_CONST) /* LOC_CONST can be used for more than just enums,
e.g., c++ static const members.
We only want to skip enums here. */
&& !(SYMBOL_CLASS (sym) == LOC_CONST
&& TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_ENUM))
|| (kind == FUNCTIONS_DOMAIN && SYMBOL_CLASS (sym) == LOC_BLOCK) || (kind == FUNCTIONS_DOMAIN && SYMBOL_CLASS (sym) == LOC_BLOCK)
|| (kind == TYPES_DOMAIN && SYMBOL_CLASS (sym) == LOC_TYPEDEF)))) || (kind == TYPES_DOMAIN && SYMBOL_CLASS (sym) == LOC_TYPEDEF))))
{ {

View File

@ -1,3 +1,9 @@
2010-06-29 Doug Evans <dje@google.com>
Test PR c++/11702.
* gdb.cp/m-static.exp: Add testcase.
* gdb.cp/m-static.h (gnu_obj_4): Add initialized static const member.
2010-06-28 Phil Muldoon <pmuldoon@redhat.com> 2010-06-28 Phil Muldoon <pmuldoon@redhat.com>
Tom Tromey <tromey@redhat.com> Tom Tromey <tromey@redhat.com>
Thiago Jung Bauermann <bauerman@br.ibm.com> Thiago Jung Bauermann <bauerman@br.ibm.com>

View File

@ -56,12 +56,14 @@ gdb_start
gdb_reinitialize_dir $srcdir/$subdir gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile} gdb_load ${binfile}
if ![runto_main] then { if ![runto_main] then {
perror "couldn't run to breakpoint" perror "couldn't run to breakpoint"
continue continue
} }
get_debug_format
set non_dwarf [expr ! [test_debug_format "DWARF 2"]]
# First, run to after we've constructed all the objects: # First, run to after we've constructed all the objects:
gdb_breakpoint [gdb_get_line_number "constructs-done"] gdb_breakpoint [gdb_get_line_number "constructs-done"]
@ -125,6 +127,16 @@ gdb_test "print test4.elsewhere" "\\$\[0-9\].* = 221" "static const int initiali
# static const int that nobody initializes. From PR gdb/635. # static const int that nobody initializes. From PR gdb/635.
gdb_test "print test4.nowhere" "field nowhere is nonexistent or has been optimized out" "static const int initialized nowhere" gdb_test "print test4.nowhere" "field nowhere is nonexistent or has been optimized out" "static const int initialized nowhere"
# static const initialized in the class definition, PR gdb/11702.
if { $non_dwarf } { setup_xfail *-*-* }
gdb_test "print test4.everywhere" "\\$\[0-9\].* = 317" "static const int initialized in class definition"
if { $non_dwarf } { setup_xfail *-*-* }
gdb_test "print test4.somewhere" "\\$\[0-9\].* = 3.14\[0-9\]*" "static const float initialized in class definition"
# Also make sure static const members can be found via "info var".
if { $non_dwarf } { setup_xfail *-*-* }
gdb_test "info variable everywhere" "File .*/m-static\[.\]h.*const int gnu_obj_4::everywhere;" "info variable everywhere"
# Perhaps at some point test4 should also include a test for a static # Perhaps at some point test4 should also include a test for a static
# const int that was initialized in the header file. But I'm not sure # const int that was initialized in the header file. But I'm not sure
# that GDB's current behavior in such situations is either consistent # that GDB's current behavior in such situations is either consistent

View File

@ -5,8 +5,8 @@ class gnu_obj_4
public: public:
static const int elsewhere; static const int elsewhere;
static const int nowhere; static const int nowhere;
// At some point, perhaps: static const int everywhere = 317;
// static const int everywhere = 317; static const float somewhere = 3.14159;
// try to ensure test4 is actually allocated // try to ensure test4 is actually allocated
int dummy; int dummy;