PR gdb/9067

* cp-valprint.c (cp_print_value_fields) Fix use of obstacks.
	cp_print_static_field)  Fix use of obstacks.
* gdb.cp/pr9067.exp:  New
* gdb.cp/pr9067.cc:   New
* gdb.cp/Makefile.in (EXECUTABLES): Add pr9067
This commit is contained in:
Chris Moller 2010-02-08 18:04:17 +00:00
parent e3e9f5a291
commit 99903ae39e
6 changed files with 92 additions and 17 deletions

View file

@ -1,3 +1,9 @@
2010-02-08 Chris Moller <cmoller@redhat.com>
PR gdb/9067
* cp-valprint.c (cp_print_value_fields) Fix use of obstacks.
cp_print_static_field) Fix use of obstacks.
2010-02-08 Pedro Alves <pedro@codesourcery.com> 2010-02-08 Pedro Alves <pedro@codesourcery.com>
* linux-nat.c (linux_nat_resume): In non-stop, also only tag * linux-nat.c (linux_nat_resume): In non-stop, also only tag

View file

@ -154,10 +154,13 @@ cp_print_value_fields (struct type *type, struct type *real_type,
struct type **dont_print_vb, int dont_print_statmem) struct type **dont_print_vb, int dont_print_statmem)
{ {
int i, len, n_baseclasses; int i, len, n_baseclasses;
char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
int fields_seen = 0; int fields_seen = 0;
CHECK_TYPEDEF (type); CHECK_TYPEDEF (type);
if (recurse == 0
&& obstack_object_size (&dont_print_statmem_obstack) > 0)
obstack_free (&dont_print_statmem_obstack, NULL);
fprintf_filtered (stream, "{"); fprintf_filtered (stream, "{");
len = TYPE_NFIELDS (type); len = TYPE_NFIELDS (type);
@ -177,14 +180,13 @@ cp_print_value_fields (struct type *type, struct type *real_type,
fprintf_filtered (stream, "<No data fields>"); fprintf_filtered (stream, "<No data fields>");
else else
{ {
struct obstack tmp_obstack = dont_print_statmem_obstack; void *statmem_obstack_top = NULL;
if (dont_print_statmem == 0) if (dont_print_statmem == 0)
{ {
/* If we're at top level, carve out a completely fresh /* Set the current printed-statics stack top. */
chunk of the obstack and use that until this particular statmem_obstack_top
invocation returns. */ = obstack_next_free (&dont_print_statmem_obstack);
obstack_finish (&dont_print_statmem_obstack);
} }
for (i = n_baseclasses; i < len; i++) for (i = n_baseclasses; i < len; i++)
@ -305,10 +307,9 @@ cp_print_value_fields (struct type *type, struct type *real_type,
if (dont_print_statmem == 0) if (dont_print_statmem == 0)
{ {
/* Free the space used to deal with the printing /* In effect, a pop of the printed-statics stack. */
of the members from top level. */ if (obstack_object_size (&dont_print_statmem_obstack) > 0)
obstack_free (&dont_print_statmem_obstack, last_dont_print); obstack_free (&dont_print_statmem_obstack, statmem_obstack_top);
dont_print_statmem_obstack = tmp_obstack;
} }
if (options->pretty) if (options->pretty)
@ -515,8 +516,8 @@ cp_print_static_field (struct type *type,
first_dont_print first_dont_print
= (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack); = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack) i = obstack_object_size (&dont_print_statmem_obstack)
- first_dont_print; / sizeof (CORE_ADDR);
while (--i >= 0) while (--i >= 0)
{ {
@ -671,8 +672,6 @@ Show printing of object's derived type based on vtable info."), NULL,
show_objectprint, show_objectprint,
&setprintlist, &showprintlist); &setprintlist, &showprintlist);
obstack_begin (&dont_print_statmem_obstack, 32 * sizeof (CORE_ADDR));
obstack_begin (&dont_print_vb_obstack, 32 * sizeof (struct type *)); obstack_begin (&dont_print_vb_obstack, 32 * sizeof (struct type *));
obstack_specify_allocation (&dont_print_statmem_obstack,
32 * sizeof (CORE_ADDR), sizeof (CORE_ADDR),
xmalloc, xfree);
} }

View file

@ -1,3 +1,10 @@
Mon Feb 8 12:54:54 2010 Chris Moller <moller@mollerware.com>
PR gdb/9067
* gdb.cp/pr9067.exp: New
* gdb.cp/pr9067.cc: New
* gdb.cp/Makefile.in (EXECUTABLES): Add pr9067
2010-02-08 Joel Brobecker <brobecker@adacore.com> 2010-02-08 Joel Brobecker <brobecker@adacore.com>
* lib/gdb.exp (gdb_test_timeout): New global variable. * lib/gdb.exp (gdb_test_timeout): New global variable.

View file

@ -4,7 +4,7 @@ srcdir = @srcdir@
EXECUTABLES = ambiguous annota2 anon-union cplusfuncs cttiadd \ EXECUTABLES = ambiguous annota2 anon-union cplusfuncs cttiadd \
derivation inherit local member-ptr method misc \ derivation inherit local member-ptr method misc \
overload ovldbreak ref-typ ref-typ2 templates userdef virtfunc namespace \ overload ovldbreak ref-typ ref-typ2 templates userdef virtfunc namespace \
ref-types ref-params method2 pr9594 gdb2495 virtfunc2 ref-types ref-params method2 pr9594 gdb2495 virtfunc2 pr9067
all info install-info dvi install uninstall installcheck check: all info install-info dvi install uninstall installcheck check:
@echo "Nothing to be done for $@..." @echo "Nothing to be done for $@..."

View file

@ -0,0 +1,17 @@
struct B;
struct A {
static B b;
};
struct B {
A a;
};
B A::b;
B b;
int main(int,char **)
{
return 0;
}

View file

@ -0,0 +1,46 @@
# Copyright 2009, 2010 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/>.
set nl "\[\r\n\]+"
if { [skip_cplus_tests] } { continue }
load_lib "cp-support.exp"
set testfile "pr9067"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {c++ debug}] != "" } {
untested pr9067.exp
return -1
}
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
if ![runto_main] then {
perror "couldn't run to breakpoint"
continue
}
gdb_test "print b" ".*same as static member.*"
gdb_exit
return 0