From 1dfaef6225a9c256024fdc7ab876e3cf312d376a Mon Sep 17 00:00:00 2001 From: Jim Kingdon Date: Mon, 8 Nov 1993 17:27:48 +0000 Subject: [PATCH] * stabsread.c (read_one_struct_field): Don't give up on unknown visibility character, just shove it in fip->list->visibility. (read_baseclasses): Don't give up on unknown virtual or visibility characters, just assume a reasonable default, complain, and keep going. (attach_fields_to_type): Complain on unrecognized visibility. One result of all this is that '9' (VISIBILITY_IGNORE) can be used in a stab as well as being something which GDB uses internally. --- gdb/ChangeLog | 8 +++++++ gdb/stabsread.c | 60 +++++++++++++++++++++++++++---------------------- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a526cda15fb..b55e0da3e24 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -3,6 +3,14 @@ Mon Nov 8 10:42:03 1993 Jim Kingdon (kingdon@lioth.cygnus.com) * stabsread.c: Remove long_kludge_name code (it was already #if 0). * stabsread.c (read_one_struct_field): Clean up comments to reflect Kung's change of 5 Nov 93. + * stabsread.c (read_one_struct_field): Don't give up on unknown + visibility character, just shove it in fip->list->visibility. + (read_baseclasses): Don't give up on unknown virtual or visibility + characters, just assume a reasonable default, complain, and keep + going. + (attach_fields_to_type): Complain on unrecognized visibility. + One result of all this is that '9' (VISIBILITY_IGNORE) can be used + in a stab as well as being something which GDB uses internally. Mon Nov 8 07:57:30 1993 Doug Evans (dje@canuck.cygnus.com) diff --git a/gdb/stabsread.c b/gdb/stabsread.c index a1a219a5ef0..93800b435e4 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -54,7 +54,12 @@ struct field_info struct nextfield { struct nextfield *next; + + /* This is the raw visibility from the stab. It is not checked + for being one of the visibilities we recognize, so code which + examines this field better be able to deal. */ int visibility; + struct field field; } *list; struct next_fnfieldlist @@ -1705,7 +1710,7 @@ rs6000_builtin_type (typenum) #define VISIBILITY_PRIVATE '0' /* Stabs character for private field */ #define VISIBILITY_PROTECTED '1' /* Stabs character for protected fld */ #define VISIBILITY_PUBLIC '2' /* Stabs character for public field */ -#define VISIBILITY_IGNORE '9' /* artificial character for ignore the field */ +#define VISIBILITY_IGNORE '9' /* Optimized out or zero length */ /* Read member function stabs info for C++ classes. The form of each member function data is: @@ -2114,36 +2119,19 @@ read_one_struct_field (fip, pp, p, type, objfile) fip -> list -> field.name = obsavestring (*pp, p - *pp, &objfile -> type_obstack); *pp = p + 1; - + /* This means we have a visibility for a field coming. */ if (**pp == '/') { (*pp)++; fip -> list -> visibility = *(*pp)++; - switch (fip -> list -> visibility) - { - case VISIBILITY_PRIVATE: - case VISIBILITY_PROTECTED: - break; - - case VISIBILITY_PUBLIC: - /* Nothing to do */ - break; - - default: - /* Unknown visibility specifier. */ - complain (&stabs_general_complaint, - "unknown visibility specifier"); - return; - break; - } } else { /* normal dbx-style format, no explicit visibility */ fip -> list -> visibility = VISIBILITY_PUBLIC; } - + fip -> list -> field.type = read_type (pp, objfile); if (**pp == ':') { @@ -2219,7 +2207,7 @@ read_one_struct_field (fip, pp, p, type, objfile) dbx gives a bit size for all fields. Note that forward refs cannot be packed, and treat enums as if they had the width of ints. */ - + if (TYPE_CODE (fip -> list -> field.type) != TYPE_CODE_INT && TYPE_CODE (fip -> list -> field.type) != TYPE_CODE_ENUM) { @@ -2255,6 +2243,7 @@ read_one_struct_field (fip, pp, p, type, objfile) '/0' (VISIBILITY_PRIVATE) '/1' (VISIBILITY_PROTECTED) '/2' (VISIBILITY_PUBLIC) + '/9' (VISIBILITY_IGNORE) or nothing, for C style fields with public visibility. @@ -2413,7 +2402,7 @@ read_baseclasses (fip, pp, type, objfile) new -> field.bitsize = 0; /* this should be an unpacked field! */ STABS_CONTINUE (pp); - switch (*(*pp)++) + switch (**pp) { case '0': /* Nothing to do. */ @@ -2422,9 +2411,14 @@ read_baseclasses (fip, pp, type, objfile) SET_TYPE_FIELD_VIRTUAL (type, i); break; default: - /* Bad visibility format. */ - return 0; + /* Unknown character. Complain and treat it as non-virtual. */ + { + static struct complaint msg = { + "Unknown virtual character `%c' for baseclass", 0, 0}; + complain (&msg, **pp); + } } + ++(*pp); new -> visibility = *(*pp)++; switch (new -> visibility) @@ -2434,8 +2428,14 @@ read_baseclasses (fip, pp, type, objfile) case VISIBILITY_PUBLIC: break; default: - /* Bad visibility format. */ - return 0; + /* Bad visibility format. Complain and treat it as + public. */ + { + static struct complaint msg = { + "Unknown visibility `%c' for baseclass", 0, 0}; + complain (&msg, new -> visibility); + new -> visibility = VISIBILITY_PUBLIC; + } } { @@ -2657,12 +2657,18 @@ attach_fields_to_type (fip, type, objfile) case VISIBILITY_IGNORE: SET_TYPE_FIELD_IGNORE (type, nfields); + break; case VISIBILITY_PUBLIC: break; default: - /* Should warn about this unknown visibility? */ + /* Unknown visibility. Complain and treat it as public. */ + { + static struct complaint msg = { + "Unknown visibility `%c' for field", 0, 0}; + complain (&msg, fip -> list -> visibility); + } break; } fip -> list = fip -> list -> next; -- 2.30.2