Fix problems with infinite recursion when printing a class

that contains a static instance of the class.
	* cp-valprint.c (dont_print_vb_obstack):  Renamed from
	dont_print_obstack, made static.
	(dont_print_statmem_obstack):  New obstack, controls printing
	of static member classes.
	(_initialize_cp_valprint):  Initialize it.
	(cp_print_static_field):  New function, handles printing of
	static members.
	(cp_print_value_fields):  New parameter dont_print_statmem to
	handle recursive printing of static member classes, use
	cp_print_static_field to handle printing of static members.
	* c-valprint.c (cp_print_value_fields):  Update prototype and
	call to include additional dont_print_statmem parameter.
	* c-valprint.c, f-valprint.c (dont_print_obstack):  Remove unused
	extern declaration.

	* alpha-tdep.c, findvar.c, infptrace.c:  Include <string.h>.

	* config/alpha/tm-alpha.h (FRAME_FIND_SAVED_REGS):  Call
	alpha_find_saved_regs if fi->saved_regs is still NULL.

	* elfread.c (elf_symtab_read):  Ensure that the filename field
	of a minsym is nonempty. Ignore solib trampoline symbols from
	the main symbol table, they might have a bogus value.

	* procfs.c (set_proc_siginfo), config/alpha/alpha-osf2.mh:
	Fix typos in comments.
This commit is contained in:
Peter Schauer 1995-03-10 11:21:32 +00:00
parent 45d6f6230e
commit a1a0d97484
8 changed files with 158 additions and 47 deletions

View file

@ -1,3 +1,34 @@
Fri Mar 10 02:49:40 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
Fix problems with infinite recursion when printing a class
that contains a static instance of the class.
* cp-valprint.c (dont_print_vb_obstack): Renamed from
dont_print_obstack, made static.
(dont_print_statmem_obstack): New obstack, controls printing
of static member classes.
(_initialize_cp_valprint): Initialize it.
(cp_print_static_field): New function, handles printing of
static members.
(cp_print_value_fields): New parameter dont_print_statmem to
handle recursive printing of static member classes, use
cp_print_static_field to handle printing of static members.
* c-valprint.c (cp_print_value_fields): Update prototype and
call to include additional dont_print_statmem parameter.
* c-valprint.c, f-valprint.c (dont_print_obstack): Remove unused
extern declaration.
* alpha-tdep.c, findvar.c, infptrace.c: Include <string.h>.
* config/alpha/tm-alpha.h (FRAME_FIND_SAVED_REGS): Call
alpha_find_saved_regs if fi->saved_regs is still NULL.
* elfread.c (elf_symtab_read): Ensure that the filename field
of a minsym is nonempty. Ignore solib trampoline symbols from
the main symbol table, they might have a bogus value.
* procfs.c (set_proc_siginfo), config/alpha/alpha-osf2.mh:
Fix typos in comments.
Thu Mar 9 17:19:47 1995 Jim Kingdon <kingdon@deneb.cygnus.com>
* mdebugread.c (parse_symbol, psymtab_to_symtab_1): Initialize

View file

@ -1,5 +1,5 @@
/* Target-dependent code for the ALPHA architecture, for GDB, the GNU Debugger.
Copyright 1993, 1994 Free Software Foundation, Inc.
Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
This file is part of GDB.
@ -27,6 +27,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "dis-asm.h"
#include "symfile.h"
#include "objfiles.h"
#include <string.h>
/* FIXME: Some of this code should perhaps be merged with mips-tdep.c. */

View file

@ -1,5 +1,5 @@
/* Support for printing C values for GDB, the GNU debugger.
Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994
Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995
Free Software Foundation, Inc.
This file is part of GDB.
@ -39,7 +39,7 @@ cp_print_class_method PARAMS ((char *, struct type *, GDB_FILE *));
extern void
cp_print_value_fields PARAMS ((struct type *, char *, GDB_FILE *, int, int,
enum val_prettyprint, struct type **));
enum val_prettyprint, struct type **, int));
extern int
cp_is_vtbl_ptr_type PARAMS ((struct type *));
@ -61,8 +61,6 @@ cp_type_print_method_args PARAMS ((struct type **, char *, char *, int,
/* END-FIXME */
extern struct obstack dont_print_obstack;
/* Print data of type TYPE located at VALADDR (within GDB), which came from
the inferior at address ADDRESS, onto stdio stream STREAM according to
@ -323,7 +321,7 @@ c_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
break;
}
cp_print_value_fields (type, valaddr, stream, format, recurse, pretty,
0);
NULL, 0);
break;
case TYPE_CODE_ENUM:

View file

@ -1,5 +1,6 @@
/* Support for printing C++ values for GDB, the GNU debugger.
Copyright 1986, 1988, 1989, 1991 Free Software Foundation, Inc.
Copyright 1986, 1988, 1989, 1991, 1994, 1995
Free Software Foundation, Inc.
This file is part of GDB.
@ -32,7 +33,13 @@ int vtblprint; /* Controls printing of vtbl's */
int objectprint; /* Controls looking up an object's derived type
using what we find in its vtables. */
static int static_field_print; /* Controls printing of static fields. */
struct obstack dont_print_obstack;
static struct obstack dont_print_vb_obstack;
static struct obstack dont_print_statmem_obstack;
static void
cp_print_static_field PARAMS ((struct type *, value_ptr, GDB_FILE *, int, int,
enum val_prettyprint));
static void
cplus_print_value PARAMS ((struct type *, char *, GDB_FILE *, int, int,
@ -50,8 +57,6 @@ extern void
cp_type_print_method_args PARAMS ((struct type **, char *, char *, int,
GDB_FILE *));
extern struct obstack dont_print_obstack;
/* END-FIXME */
void
@ -209,16 +214,19 @@ cp_is_vtbl_member(type)
void
cp_print_value_fields (type, valaddr, stream, format, recurse, pretty,
dont_print)
dont_print_vb, dont_print_statmem)
struct type *type;
char *valaddr;
GDB_FILE *stream;
int format;
int recurse;
enum val_prettyprint pretty;
struct type **dont_print;
struct type **dont_print_vb;
int dont_print_statmem;
{
int i, len, n_baseclasses;
struct obstack tmp_obstack;
char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
check_stub_type (type);
@ -230,7 +238,7 @@ cp_print_value_fields (type, valaddr, stream, format, recurse, pretty,
duplicates of virtual baseclasses. */
if (n_baseclasses > 0)
cplus_print_value (type, valaddr, stream, format, recurse+1, pretty,
dont_print);
dont_print_vb);
if (!len && n_baseclasses == 1)
fprintf_filtered (stream, "<No data fields>");
@ -239,6 +247,15 @@ cp_print_value_fields (type, valaddr, stream, format, recurse, pretty,
extern int inspect_it;
int fields_seen = 0;
if (dont_print_statmem == 0)
{
/* If we're at top level, carve out a completely fresh
chunk of the obstack and use that until this particular
invocation returns. */
tmp_obstack = dont_print_statmem_obstack;
obstack_finish (&dont_print_statmem_obstack);
}
for (i = n_baseclasses; i < len; i++)
{
/* If requested, skip printing of static fields. */
@ -336,10 +353,9 @@ cp_print_value_fields (type, valaddr, stream, format, recurse, pretty,
{
v = value_at (TYPE_FIELD_TYPE (type, i),
(CORE_ADDR)SYMBOL_BLOCK_VALUE (sym));
val_print (TYPE_FIELD_TYPE (type, i),
VALUE_CONTENTS_RAW (v),
VALUE_ADDRESS (v),
stream, format, 0, recurse + 1, pretty);
cp_print_static_field (TYPE_FIELD_TYPE (type, i), v,
stream, format, recurse + 1,
pretty);
}
}
else
@ -352,6 +368,14 @@ cp_print_value_fields (type, valaddr, stream, format, recurse, pretty,
annotate_field_end ();
}
if (dont_print_statmem == 0)
{
/* Free the space used to deal with the printing
of the members from top level. */
obstack_free (&dont_print_statmem_obstack, last_dont_print);
dont_print_statmem_obstack = tmp_obstack;
}
if (pretty)
{
fprintf_filtered (stream, "\n");
@ -365,28 +389,29 @@ cp_print_value_fields (type, valaddr, stream, format, recurse, pretty,
baseclasses. */
static void
cplus_print_value (type, valaddr, stream, format, recurse, pretty, dont_print)
cplus_print_value (type, valaddr, stream, format, recurse, pretty,
dont_print_vb)
struct type *type;
char *valaddr;
GDB_FILE *stream;
int format;
int recurse;
enum val_prettyprint pretty;
struct type **dont_print;
struct type **dont_print_vb;
{
struct obstack tmp_obstack;
struct type **last_dont_print
= (struct type **)obstack_next_free (&dont_print_obstack);
= (struct type **)obstack_next_free (&dont_print_vb_obstack);
int i, n_baseclasses = TYPE_N_BASECLASSES (type);
if (dont_print == 0)
if (dont_print_vb == 0)
{
/* If we're at top level, carve out a completely fresh
chunk of the obstack and use that until this particular
invocation returns. */
tmp_obstack = dont_print_obstack;
tmp_obstack = dont_print_vb_obstack;
/* Bump up the high-water mark. Now alpha is omega. */
obstack_finish (&dont_print_obstack);
obstack_finish (&dont_print_vb_obstack);
}
for (i = 0; i < n_baseclasses; i++)
@ -403,16 +428,16 @@ cplus_print_value (type, valaddr, stream, format, recurse, pretty, dont_print)
if (BASETYPE_VIA_VIRTUAL (type, i))
{
struct type **first_dont_print
= (struct type **)obstack_base (&dont_print_obstack);
= (struct type **)obstack_base (&dont_print_vb_obstack);
int j = (struct type **)obstack_next_free (&dont_print_obstack)
int j = (struct type **)obstack_next_free (&dont_print_vb_obstack)
- first_dont_print;
while (--j >= 0)
if (TYPE_BASECLASS (type, i) == first_dont_print[j])
goto flush_it;
obstack_ptr_grow (&dont_print_obstack, TYPE_BASECLASS (type, i));
obstack_ptr_grow (&dont_print_vb_obstack, TYPE_BASECLASS (type, i));
}
/* Fix to use baseclass_offset instead. FIXME */
@ -440,24 +465,76 @@ cplus_print_value (type, valaddr, stream, format, recurse, pretty, dont_print)
else
cp_print_value_fields (TYPE_BASECLASS (type, i), baddr, stream, format,
recurse, pretty,
(struct type **) obstack_base (&dont_print_obstack));
(struct type **) obstack_base (&dont_print_vb_obstack),
0);
fputs_filtered (", ", stream);
flush_it:
;
}
if (dont_print == 0)
if (dont_print_vb == 0)
{
/* Free the space used to deal with the printing
of this type from top level. */
obstack_free (&dont_print_obstack, last_dont_print);
obstack_free (&dont_print_vb_obstack, last_dont_print);
/* Reset watermark so that we can continue protecting
ourselves from whatever we were protecting ourselves. */
dont_print_obstack = tmp_obstack;
dont_print_vb_obstack = tmp_obstack;
}
}
/* Print value of a static member.
To avoid infinite recursion when printing a class that contains
a static instance of the class, we keep the addresses of all printed
static member classes in an obstack and refuse to print them more
than once.
VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
have the same meanings as in c_val_print. */
static void
cp_print_static_field (type, val, stream, format, recurse, pretty)
struct type *type;
value_ptr val;
GDB_FILE *stream;
int format;
int recurse;
enum val_prettyprint pretty;
{
if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
{
CORE_ADDR *first_dont_print;
int i;
first_dont_print
= (CORE_ADDR *)obstack_base (&dont_print_statmem_obstack);
i = (CORE_ADDR *)obstack_next_free (&dont_print_statmem_obstack)
- first_dont_print;
while (--i >= 0)
{
if (VALUE_ADDRESS (val) == first_dont_print[i])
{
fputs_filtered ("<same as static member of an already seen type>",
stream);
return;
}
}
obstack_grow (&dont_print_statmem_obstack, &VALUE_ADDRESS (val),
sizeof (CORE_ADDR));
check_stub_type (type);
cp_print_value_fields (type, VALUE_CONTENTS (val),
stream, format, recurse, pretty,
NULL, 1);
return;
}
val_print (type, VALUE_CONTENTS (val), VALUE_ADDRESS (val),
stream, format, 0, recurse, pretty);
}
void
cp_print_class_member (valaddr, domain, stream, prefix)
char *valaddr;
@ -540,5 +617,8 @@ _initialize_cp_valprint ()
/* Give people the defaults which they are used to. */
objectprint = 0;
vtblprint = 0;
obstack_begin (&dont_print_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, free);
}

View file

@ -219,7 +219,7 @@ LOCAL FUNCTION
SYNOPSIS
void elf_symtab_read (bfd *abfd, CORE_ADDR addr,
struct objfile *objfile)
struct objfile *objfile, int dynamic)
DESCRIPTION
@ -260,7 +260,7 @@ elf_symtab_read (abfd, addr, objfile, dynamic)
asymbol *filesym = 0;
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
/* Name of filesym, as saved on the symbol_obstack. */
char *filesymname;
char *filesymname = obsavestring ("", 0, &objfile->symbol_obstack);
#endif
struct dbx_symfile_info *dbx = (struct dbx_symfile_info *)
objfile->sym_stab_info;
@ -304,9 +304,12 @@ elf_symtab_read (abfd, addr, objfile, dynamic)
continue;
}
if (sym -> section == &bfd_und_section
if (dynamic
&& sym -> section == &bfd_und_section
&& (sym -> flags & BSF_FUNCTION))
{
struct minimal_symbol *msym;
/* Symbol is a reference to a function defined in
a shared library.
If its value is non zero then it is usually the address
@ -314,17 +317,17 @@ elf_symtab_read (abfd, addr, objfile, dynamic)
relative to the base address.
If its value is zero then the dynamic linker has to resolve
the symbol. We are unable to find any meaningful address
for this symbol in the executable file, so we skip it.
Irix 5 has a zero value for all shared library functions
in the main symbol table, but the dynamic symbol table
provides the right values. */
for this symbol in the executable file, so we skip it. */
symaddr = sym -> value;
if (symaddr == 0)
continue;
symaddr += addr;
record_minimal_symbol_and_info ((char *) sym -> name, symaddr,
mst_solib_trampoline, NULL,
objfile);
msym = record_minimal_symbol_and_info
((char *) sym -> name, symaddr,
mst_solib_trampoline, NULL, objfile);
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
msym->filename = filesymname;
#endif
continue;
}

View file

@ -1,5 +1,5 @@
/* Support for printing Fortran values for GDB, the GNU debugger.
Copyright 1993, 1994 Free Software Foundation, Inc.
Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
Contributed by Motorola. Adapted from the C definitions by Farooq Butt
(fmbutt@engage.sps.mot.com), additionally worked over by Stan Shebs.
@ -33,8 +33,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "gdbcore.h"
#include "command.h"
extern struct obstack dont_print_obstack;
extern unsigned int print_max; /* No of array elements to print */
extern int calc_f77_array_dims PARAMS ((struct type *));

View file

@ -1,5 +1,5 @@
/* Find a variable's value in memory, for GDB, the GNU debugger.
Copyright 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
Copyright 1986, 1987, 1989, 1991, 1994, 1995 Free Software Foundation, Inc.
This file is part of GDB.
@ -25,6 +25,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "gdbcore.h"
#include "inferior.h"
#include "target.h"
#include <string.h>
static void write_register_pid PARAMS ((int regno, LONGEST val, int pid));
@ -629,7 +630,6 @@ read_register_pid (regno, pid)
#endif
/* Store VALUE, into the raw contents of register number REGNO. */
/* FIXME: The val arg should probably be a LONGEST. */
void
write_register (regno, val)

View file

@ -2520,7 +2520,7 @@ set_proc_siginfo (pip, signo)
#ifdef PROCFS_DONT_PIOCSSIG_CURSIG
/* With Alpha OSF/1 procfs, the kernel gets really confused if it
receives a PIOCSSSIG with a signal identical to the current signal,
receives a PIOCSSIG with a signal identical to the current signal,
it messes up the current signal. Work around the kernel bug. */
if (signo == pip -> prstatus.pr_cursig)
return;