diff options
author | John Gilmore <gnu@cygnus> | 1993-02-09 08:42:20 +0000 |
---|---|---|
committer | John Gilmore <gnu@cygnus> | 1993-02-09 08:42:20 +0000 |
commit | 2a021f21e93c462a8e6205a602c68f8db244f587 (patch) | |
tree | 6843571959b6af304c2fb75146e5c86d81b72a33 /gdb/stabsread.c | |
parent | 67c9903f93162ac04ec2cbe071bbfd89b56d0322 (diff) | |
download | gdb-2a021f21e93c462a8e6205a602c68f8db244f587.zip gdb-2a021f21e93c462a8e6205a602c68f8db244f587.tar.gz gdb-2a021f21e93c462a8e6205a602c68f8db244f587.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/stabsread.c')
-rw-r--r-- | gdb/stabsread.c | 191 |
1 files changed, 78 insertions, 113 deletions
diff --git a/gdb/stabsread.c b/gdb/stabsread.c index c14835e..b3dd4f0 100644 --- a/gdb/stabsread.c +++ b/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 |