* stabsread.c (define_symbol): Complain about unrecognized names
that begin with CPLUS_MARKER (often '$'), but don't die. Fix suggested by gb@cs.purdue.edu (Gerald Baumgartner). (read_cpp_abbrev): Don't use the class name as part of the vtable pointer member name (_vptr$) in $vf abbrevs or unrecognized abbrevs. Inspired by Mike Tiemann. (read_tilde_fields): Comment. Remove ancient dead code. Remove erroneous but non-dead code. Simplify. Add complaints. (in general): Remove extraneous (parentheses) in return statements.
This commit is contained in:
parent
67c9903f93
commit
2a021f21e9
2 changed files with 91 additions and 113 deletions
|
@ -1,3 +1,16 @@
|
|||
Tue Feb 9 00:19:28 1993 John Gilmore (gnu@cygnus.com)
|
||||
|
||||
* stabsread.c (define_symbol): Complain about unrecognized names
|
||||
that begin with CPLUS_MARKER (often '$'), but don't die. Fix
|
||||
suggested by gb@cs.purdue.edu (Gerald Baumgartner).
|
||||
(read_cpp_abbrev): Don't use the class name as part of the
|
||||
vtable pointer member name (_vptr$) in $vf abbrevs or unrecognized
|
||||
abbrevs. Inspired by Mike Tiemann.
|
||||
(read_tilde_fields): Comment. Remove ancient dead code.
|
||||
Remove erroneous but non-dead code. Simplify. Add complaints.
|
||||
(in general): Remove extraneous (parentheses) in return
|
||||
statements.
|
||||
|
||||
Fri Feb 5 14:01:22 1993 John Gilmore (gnu@cygnus.com)
|
||||
|
||||
* coffread.c (coff_lookup_type): Fix fencepost error reported
|
||||
|
|
191
gdb/stabsread.c
191
gdb/stabsread.c
|
@ -1,5 +1,5 @@
|
|||
/* Support routines for decoding "stabs" debugging information format.
|
||||
Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992
|
||||
Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
@ -177,6 +177,12 @@ struct complaint range_type_base_complaint =
|
|||
struct complaint reg_value_complaint =
|
||||
{"register number too large in symbol %s", 0, 0};
|
||||
|
||||
struct complaint vtbl_notfound_complaint =
|
||||
{"virtual function table pointer not found when defining class `%s'", 0, 0};
|
||||
|
||||
struct complaint unrecognized_cplus_name_complaint =
|
||||
{"Unknown C++ symbol name `%s'", 0, 0};
|
||||
|
||||
struct complaint stabs_general_complaint =
|
||||
{"%s", 0, 0};
|
||||
|
||||
|
@ -486,7 +492,8 @@ define_symbol (valu, string, desc, type, objfile)
|
|||
goto normal;
|
||||
|
||||
default:
|
||||
abort ();
|
||||
complain (unrecognized_cplus_name_complaint, string);
|
||||
goto normal; /* Do *something* with it */
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1449,7 +1456,7 @@ read_member_functions (fip, pp, type, objfile)
|
|||
if (**pp != ':')
|
||||
{
|
||||
/* Invalid symtab info for member function. */
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1552,7 +1559,7 @@ read_member_functions (fip, pp, type, objfile)
|
|||
new_sublist -> fn_field.fcontext = look_ahead_type;
|
||||
if (**pp != ';')
|
||||
{
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1623,7 +1630,7 @@ read_member_functions (fip, pp, type, objfile)
|
|||
TYPE_NFN_FIELDS_TOTAL (type) = total_length;
|
||||
}
|
||||
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Special GNU C++ name.
|
||||
|
@ -1639,25 +1646,15 @@ read_cpp_abbrev (fip, pp, type, objfile)
|
|||
register char *p;
|
||||
const char *prefix;
|
||||
char *name;
|
||||
char cpp_abbrev;
|
||||
struct type *context;
|
||||
|
||||
p = *pp;
|
||||
if (*++p == 'v')
|
||||
{
|
||||
name = NULL;
|
||||
switch (*++p)
|
||||
{
|
||||
case 'f':
|
||||
prefix = vptr_name;
|
||||
break;
|
||||
case 'b':
|
||||
prefix = vb_name;
|
||||
break;
|
||||
default:
|
||||
complain (&invalid_cpp_abbrev_complaint, *pp);
|
||||
prefix = "INVALID_C++_ABBREV";
|
||||
break;
|
||||
}
|
||||
cpp_abbrev = *++p;
|
||||
|
||||
*pp = p + 1;
|
||||
|
||||
/* At this point, *pp points to something like "22:23=*22...",
|
||||
|
@ -1666,14 +1663,32 @@ read_cpp_abbrev (fip, pp, type, objfile)
|
|||
type, find it's name, and construct the field name. */
|
||||
|
||||
context = read_type (pp, objfile);
|
||||
name = type_name_no_tag (context);
|
||||
if (name == NULL)
|
||||
|
||||
switch (cpp_abbrev)
|
||||
{
|
||||
complain (&invalid_cpp_type_complaint, symnum);
|
||||
name = "FOO";
|
||||
case 'f': /* $vf -- a virtual function table pointer */
|
||||
fip->list->field.name =
|
||||
obconcat (&objfile->type_obstack, vptr_name, "", "");
|
||||
break;
|
||||
|
||||
case 'b': /* $vb -- a virtual bsomethingorother */
|
||||
name = type_name_no_tag (context);
|
||||
if (name == NULL)
|
||||
{
|
||||
complain (&invalid_cpp_type_complaint, symnum);
|
||||
name = "FOO";
|
||||
}
|
||||
fip->list->field.name =
|
||||
obconcat (&objfile->type_obstack, vb_name, name, "");
|
||||
break;
|
||||
|
||||
default:
|
||||
complain (&invalid_cpp_abbrev_complaint, *pp);
|
||||
fip->list->field.name =
|
||||
obconcat (&objfile->type_obstack,
|
||||
"INVALID_CPLUSPLUS_ABBREV", "", "");
|
||||
break;
|
||||
}
|
||||
fip -> list -> field.name =
|
||||
obconcat (&objfile -> type_obstack, prefix, name, "");
|
||||
|
||||
/* At this point, *pp points to the ':'. Skip it and read the
|
||||
field type. */
|
||||
|
@ -1683,12 +1698,12 @@ read_cpp_abbrev (fip, pp, type, objfile)
|
|||
{
|
||||
complain (&invalid_cpp_abbrev_complaint, *pp);
|
||||
}
|
||||
fip -> list -> field.type = read_type (pp, objfile);
|
||||
fip->list->field.type = read_type (pp, objfile);
|
||||
(*pp)++; /* Skip the comma. */
|
||||
fip -> list -> field.bitpos = read_number (pp, ';');
|
||||
fip->list->field.bitpos = read_number (pp, ';');
|
||||
/* This field is unpacked. */
|
||||
fip -> list -> field.bitsize = 0;
|
||||
fip -> list -> visibility = VISIBILITY_PRIVATE;
|
||||
fip->list->field.bitsize = 0;
|
||||
fip->list->visibility = VISIBILITY_PRIVATE;
|
||||
}
|
||||
else if (*p == '_')
|
||||
{
|
||||
|
@ -1910,7 +1925,7 @@ read_struct_fields (fip, pp, type, objfile)
|
|||
partially constructed entry which we now scrub. */
|
||||
fip -> list = fip -> list -> next;
|
||||
}
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* The stabs for C++ derived classes contain baseclass information which
|
||||
|
@ -1948,7 +1963,7 @@ read_baseclasses (fip, pp, type, objfile)
|
|||
|
||||
if (**pp != '!')
|
||||
{
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1996,7 +2011,7 @@ read_baseclasses (fip, pp, type, objfile)
|
|||
break;
|
||||
default:
|
||||
/* Bad visibility format. */
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
new -> visibility = *(*pp)++;
|
||||
|
@ -2008,7 +2023,7 @@ read_baseclasses (fip, pp, type, objfile)
|
|||
break;
|
||||
default:
|
||||
/* Bad visibility format. */
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The remaining value is the bit offset of the portion of the object
|
||||
|
@ -2026,9 +2041,17 @@ read_baseclasses (fip, pp, type, objfile)
|
|||
/* skip trailing ';' and bump count of number of fields seen */
|
||||
(*pp)++;
|
||||
}
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* The tail end of stabs for C++ classes that contain a virtual function
|
||||
pointer contains a tilde, a %, and a type number.
|
||||
The type number refers to the base class (possibly this class itself) which
|
||||
contains the vtable pointer for the current class.
|
||||
|
||||
This function is called when we have parsed all the method declarations,
|
||||
so we can look for the vptr base class info. */
|
||||
|
||||
static int
|
||||
read_tilde_fields (fip, pp, type, objfile)
|
||||
struct field_info *fip;
|
||||
|
@ -2060,53 +2083,15 @@ read_tilde_fields (fip, pp, type, objfile)
|
|||
/* Read either a '%' or the final ';'. */
|
||||
if (*(*pp)++ == '%')
|
||||
{
|
||||
/* We'd like to be able to derive the vtable pointer field
|
||||
from the type information, but when it's inherited, that's
|
||||
hard. A reason it's hard is because we may read in the
|
||||
info about a derived class before we read in info about
|
||||
the base class that provides the vtable pointer field.
|
||||
Once the base info has been read, we could fill in the info
|
||||
for the derived classes, but for the fact that by then,
|
||||
we don't remember who needs what. */
|
||||
|
||||
#if 0
|
||||
int predicted_fieldno = -1;
|
||||
#endif
|
||||
|
||||
/* Now we must record the virtual function table pointer's
|
||||
field information. */
|
||||
/* The next number is the type number of the base class
|
||||
(possibly our own class) which supplies the vtable for
|
||||
this class. Parse it out, and search that class to find
|
||||
its vtable pointer, and install those into TYPE_VPTR_BASETYPE
|
||||
and TYPE_VPTR_FIELDNO. */
|
||||
|
||||
struct type *t;
|
||||
int i;
|
||||
|
||||
#if 0
|
||||
{
|
||||
/* In version 2, we derive the vfield ourselves. */
|
||||
for (n = 0; n < TYPE_NFIELDS (type); n++)
|
||||
{
|
||||
if (! strncmp (TYPE_FIELD_NAME (type, n), vptr_name,
|
||||
sizeof (vptr_name) - 1))
|
||||
{
|
||||
predicted_fieldno = n;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (predicted_fieldno < 0)
|
||||
{
|
||||
for (n = 0; n < TYPE_N_BASECLASSES (type); n++)
|
||||
{
|
||||
if (! TYPE_FIELD_VIRTUAL (type, n)
|
||||
&& TYPE_VPTR_FIELDNO (TYPE_BASECLASS (type, n)) >= 0)
|
||||
{
|
||||
predicted_fieldno =
|
||||
TYPE_VPTR_FIELDNO (TYPE_BASECLASS (type, n));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
t = read_type (pp, objfile);
|
||||
p = (*pp)++;
|
||||
while (*p != '\0' && *p != ';')
|
||||
|
@ -2116,57 +2101,37 @@ read_tilde_fields (fip, pp, type, objfile)
|
|||
if (*p == '\0')
|
||||
{
|
||||
/* Premature end of symbol. */
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
TYPE_VPTR_BASETYPE (type) = t;
|
||||
if (type == t)
|
||||
if (type == t) /* Our own class provides vtbl ptr */
|
||||
{
|
||||
if (TYPE_FIELD_NAME (t, TYPE_N_BASECLASSES (t)) == 0)
|
||||
for (i = TYPE_NFIELDS (t) - 1;
|
||||
i >= TYPE_N_BASECLASSES (t);
|
||||
--i)
|
||||
{
|
||||
/* FIXME-tiemann: what's this? */
|
||||
#if 0
|
||||
TYPE_VPTR_FIELDNO (type) = i = TYPE_N_BASECLASSES (t);
|
||||
#else
|
||||
error_type (pp);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = TYPE_NFIELDS (t) - 1;
|
||||
i >= TYPE_N_BASECLASSES (t);
|
||||
--i)
|
||||
if (! strncmp (TYPE_FIELD_NAME (t, i), vptr_name,
|
||||
sizeof (vptr_name) - 1))
|
||||
{
|
||||
if (! strncmp (TYPE_FIELD_NAME (t, i), vptr_name,
|
||||
sizeof (vptr_name) - 1))
|
||||
{
|
||||
TYPE_VPTR_FIELDNO (type) = i;
|
||||
break;
|
||||
}
|
||||
TYPE_VPTR_FIELDNO (type) = i;
|
||||
goto gotit;
|
||||
}
|
||||
}
|
||||
if (i < 0)
|
||||
{
|
||||
/* Virtual function table field not found. */
|
||||
return (0);
|
||||
}
|
||||
/* Virtual function table field not found. */
|
||||
complain (vtbl_notfound_complaint, TYPE_NAME (type));
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (t);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (TYPE_VPTR_FIELDNO (type) != predicted_fieldno)
|
||||
{
|
||||
error ("TYPE_VPTR_FIELDNO miscalculated");
|
||||
}
|
||||
#endif
|
||||
|
||||
gotit:
|
||||
*pp = p + 1;
|
||||
}
|
||||
}
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -2181,7 +2146,7 @@ attach_fn_fields_to_type (fip, type)
|
|||
if (TYPE_CODE (TYPE_BASECLASS (type, n)) == TYPE_CODE_UNDEF)
|
||||
{
|
||||
/* @@ Memory leak on objfile -> type_obstack? */
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
TYPE_NFN_FIELDS_TOTAL (type) +=
|
||||
TYPE_NFN_FIELDS_TOTAL (TYPE_BASECLASS (type, n));
|
||||
|
@ -2194,7 +2159,7 @@ attach_fn_fields_to_type (fip, type)
|
|||
--n; /* Circumvent Sun3 compiler bug */
|
||||
TYPE_FN_FIELDLISTS (type)[n] = fip -> fnlist -> fn_fieldlist;
|
||||
}
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Create the vector of fields, and record how big it is.
|
||||
|
@ -2273,7 +2238,7 @@ attach_fields_to_type (fip, type, objfile)
|
|||
}
|
||||
fip -> list = fip -> list -> next;
|
||||
}
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Read the description of a structure (or union type) and return an object
|
||||
|
|
Loading…
Reference in a new issue