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:
parent
6e70227d64
commit
254e6b9ed4
8 changed files with 68 additions and 8 deletions
|
@ -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.
|
||||||
|
|
5
gdb/NEWS
5
gdb/NEWS
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue