* stabsread.c: Changes and bug fixes for cfront support.
Fix bug for class data members. Fix parsing bug when no base classes exist. Fix memory bug - allocate space for cplusplus specific info. Add support for static data. Add prototypes for static functions. Enhance comments to show what each function expects to parse. Cleanup code. * stabsread.c(resolve_cont),dbxread.c(resolve_cont): Rename function to resolve_cfront_continuation.
This commit is contained in:
parent
7dbb5eed30
commit
00d93b6d5e
|
@ -1,3 +1,16 @@
|
||||||
|
Sat Apr 27 00:12:05 1996 Dawn Perchik (dawn@cygnus.com)
|
||||||
|
|
||||||
|
* stabsread.c: Changes and bug fixes for cfront support.
|
||||||
|
Fix bug for class data members.
|
||||||
|
Fix parsing bug when no base classes exist.
|
||||||
|
Fix memory bug - allocate space for cplusplus specific info.
|
||||||
|
Add support for static data.
|
||||||
|
Add prototypes for static functions.
|
||||||
|
Enhance comments to show what each function expects to parse.
|
||||||
|
Cleanup code.
|
||||||
|
* stabsread.c(resolve_cont),dbxread.c(resolve_cont): Rename
|
||||||
|
function to resolve_cfront_continuation.
|
||||||
|
|
||||||
Fri Apr 26 23:58:26 1996 Jeffrey A Law (law@cygnus.com)
|
Fri Apr 26 23:58:26 1996 Jeffrey A Law (law@cygnus.com)
|
||||||
|
|
||||||
* infrun.c (wait_for_inferior): Call registers_changed when
|
* infrun.c (wait_for_inferior): Call registers_changed when
|
||||||
|
|
203
gdb/stabsread.c
203
gdb/stabsread.c
|
@ -143,6 +143,34 @@ static int
|
||||||
read_cpp_abbrev PARAMS ((struct field_info *, char **, struct type *,
|
read_cpp_abbrev PARAMS ((struct field_info *, char **, struct type *,
|
||||||
struct objfile *));
|
struct objfile *));
|
||||||
|
|
||||||
|
/* new functions added for cfront support */
|
||||||
|
|
||||||
|
extern void
|
||||||
|
resolve_cfront_continuation PARAMS ((struct objfile *, struct symbol *,
|
||||||
|
char * p));
|
||||||
|
|
||||||
|
static int
|
||||||
|
copy_cfront_struct_fields PARAMS ((struct field_info *, struct type *,
|
||||||
|
struct objfile *));
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_cfront_method_physname PARAMS ((char *));
|
||||||
|
|
||||||
|
static int
|
||||||
|
read_cfront_baseclasses PARAMS ((struct field_info *, char **,
|
||||||
|
struct type *, struct objfile *));
|
||||||
|
|
||||||
|
static int
|
||||||
|
read_cfront_static_fields PARAMS ((struct field_info *, char**,
|
||||||
|
struct type *, struct objfile *));
|
||||||
|
static int
|
||||||
|
read_cfront_member_functions PARAMS ((struct field_info *, char **,
|
||||||
|
struct type *, struct objfile *));
|
||||||
|
|
||||||
|
/* end new functions added for cfront support */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static const char vptr_name[] = { '_','v','p','t','r',CPLUS_MARKER,'\0' };
|
static const char vptr_name[] = { '_','v','p','t','r',CPLUS_MARKER,'\0' };
|
||||||
static const char vb_name[] = { '_','v','b',CPLUS_MARKER,'\0' };
|
static const char vb_name[] = { '_','v','b',CPLUS_MARKER,'\0' };
|
||||||
|
|
||||||
|
@ -561,11 +589,12 @@ get_cfront_method_physname(fname)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read base classes within cfront class definition.
|
/* Read base classes within cfront class definition.
|
||||||
eg: class A : Bpri, public Bpub, virtual Bvir
|
eg: A:ZcA;1@Bpub v2@Bvirpri;__ct__1AFv func__1AFv *sfunc__1AFv ;as__1A ;;
|
||||||
A:T(0,27)=s20b__4Bpri:(0,3),0,32;OBpub:(0,25),32,8;a__1A:(0,3),64,32;PBvir:(0,28)=*(0,26),96,32;OBvir:(0,26),128,8;;
|
^^^^^^^^^^^^^^^^^^
|
||||||
A:ZcA;2@Bpri 1@Bpub v2@Bvir;foopri__1AFv foopro__1AFv __ct__1AFv __ct__1AFRC1A foopub__1AFv ;;;
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
A:ZcA;;foopri__1AFv foopro__1AFv __ct__1AFv __ct__1AFRC1A foopub__1AFv ;;;
|
||||||
*/
|
^
|
||||||
|
*/
|
||||||
static int
|
static int
|
||||||
read_cfront_baseclasses(fip, pp, type, objfile)
|
read_cfront_baseclasses(fip, pp, type, objfile)
|
||||||
struct field_info *fip;
|
struct field_info *fip;
|
||||||
|
@ -589,7 +618,7 @@ read_cfront_baseclasses(fip, pp, type, objfile)
|
||||||
|
|
||||||
if (**pp==';') /* no base classes; return */
|
if (**pp==';') /* no base classes; return */
|
||||||
{
|
{
|
||||||
*pp++;
|
++(*pp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -601,7 +630,8 @@ read_cfront_baseclasses(fip, pp, type, objfile)
|
||||||
bnum++; /* add one more for last one */
|
bnum++; /* add one more for last one */
|
||||||
|
|
||||||
/* now parse the base classes until we get to the start of the methods
|
/* now parse the base classes until we get to the start of the methods
|
||||||
(code extracted from read_baseclasses) */
|
(code extracted and munged from read_baseclasses) */
|
||||||
|
ALLOCATE_CPLUS_STRUCT_TYPE (type);
|
||||||
TYPE_N_BASECLASSES(type) = bnum;
|
TYPE_N_BASECLASSES(type) = bnum;
|
||||||
|
|
||||||
/* allocate space */
|
/* allocate space */
|
||||||
|
@ -691,8 +721,7 @@ read_cfront_baseclasses(fip, pp, type, objfile)
|
||||||
bsym = lookup_symbol (bname, 0, STRUCT_NAMESPACE, 0, 0); /*demangled_name*/
|
bsym = lookup_symbol (bname, 0, STRUCT_NAMESPACE, 0, 0); /*demangled_name*/
|
||||||
if (bsym)
|
if (bsym)
|
||||||
{
|
{
|
||||||
struct type * btype = SYMBOL_TYPE(bsym);
|
new -> field.type = SYMBOL_TYPE(bsym);
|
||||||
new -> field.type = btype;
|
|
||||||
new -> field.name = type_name_no_tag (new -> field.type);
|
new -> field.name = type_name_no_tag (new -> field.type);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -710,7 +739,14 @@ read_cfront_baseclasses(fip, pp, type, objfile)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
/* read cfront member functions.
|
||||||
|
pp points to string starting with list of functions
|
||||||
|
eg: A:ZcA;1@Bpub v2@Bvirpri;__ct__1AFv func__1AFv *sfunc__1AFv ;as__1A ;;
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
A:ZcA;;foopri__1AFv foopro__1AFv __ct__1AFv __ct__1AFRC1A foopub__1AFv ;;;
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
*/
|
||||||
|
|
||||||
read_cfront_member_functions(fip, pp, type, objfile)
|
read_cfront_member_functions(fip, pp, type, objfile)
|
||||||
struct field_info *fip;
|
struct field_info *fip;
|
||||||
char **pp;
|
char **pp;
|
||||||
|
@ -913,7 +949,7 @@ read_cfront_member_functions(fip, pp, type, objfile)
|
||||||
to add information such as methods to classes.
|
to add information such as methods to classes.
|
||||||
Examples of "p": "sA;;__ct__1AFv foo__1AFv ;;;" */
|
Examples of "p": "sA;;__ct__1AFv foo__1AFv ;;;" */
|
||||||
void
|
void
|
||||||
resolve_cont(objfile, sym, p)
|
resolve_cfront_continuation(objfile, sym, p)
|
||||||
struct objfile * objfile;
|
struct objfile * objfile;
|
||||||
struct symbol * sym;
|
struct symbol * sym;
|
||||||
char * p;
|
char * p;
|
||||||
|
@ -965,8 +1001,10 @@ resolve_cont(objfile, sym, p)
|
||||||
if (!read_cfront_baseclasses (&fi, &p, type, objfile)
|
if (!read_cfront_baseclasses (&fi, &p, type, objfile)
|
||||||
/* g++ does this next, but cfront already did this:
|
/* g++ does this next, but cfront already did this:
|
||||||
|| !read_struct_fields (&fi, &p, type, objfile) */
|
|| !read_struct_fields (&fi, &p, type, objfile) */
|
||||||
|| !attach_fields_to_type (&fi, type, objfile)
|
|| !copy_cfront_struct_fields (&fi, type, objfile)
|
||||||
|| !read_cfront_member_functions (&fi, &p, type, objfile)
|
|| !read_cfront_member_functions (&fi, &p, type, objfile)
|
||||||
|
|| !read_cfront_static_fields(&fi, &p, type, objfile)
|
||||||
|
|| !attach_fields_to_type (&fi, type, objfile)
|
||||||
|| !attach_fn_fields_to_type (&fi, type)
|
|| !attach_fn_fields_to_type (&fi, type)
|
||||||
/* g++ does this next, but cfront doesn't seem to have this:
|
/* g++ does this next, but cfront doesn't seem to have this:
|
||||||
|| !read_tilde_fields (&fi, &p, type, objfile) */
|
|| !read_tilde_fields (&fi, &p, type, objfile) */
|
||||||
|
@ -3292,6 +3330,147 @@ attach_fn_fields_to_type (fip, type)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* read cfront class static data.
|
||||||
|
pp points to string starting with the list of static data
|
||||||
|
eg: A:ZcA;1@Bpub v2@Bvirpri;__ct__1AFv func__1AFv *sfunc__1AFv ;as__1A ;;
|
||||||
|
^^^^^^^^
|
||||||
|
|
||||||
|
A:ZcA;;foopri__1AFv foopro__1AFv __ct__1AFv __ct__1AFRC1A foopub__1AFv ;;;
|
||||||
|
^
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int
|
||||||
|
read_cfront_static_fields(fip, pp, type, objfile)
|
||||||
|
struct field_info *fip;
|
||||||
|
char **pp;
|
||||||
|
struct type *type;
|
||||||
|
struct objfile *objfile;
|
||||||
|
{
|
||||||
|
int nfields = TYPE_NFIELDS(type);
|
||||||
|
int i;
|
||||||
|
struct nextfield * new;
|
||||||
|
struct type *stype;
|
||||||
|
char * sname;
|
||||||
|
struct symbol * ref_static=0;
|
||||||
|
|
||||||
|
if (**pp==';') /* no static data; return */
|
||||||
|
{
|
||||||
|
++(*pp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process each field in the list until we find the terminating ";" */
|
||||||
|
|
||||||
|
/* eg: p = "as__1A ;;;" */
|
||||||
|
STABS_CONTINUE (pp, objfile); /* handle \\ */
|
||||||
|
while (**pp!=';' && (sname = get_substring(pp,' '),sname))
|
||||||
|
{
|
||||||
|
ref_static = lookup_symbol (sname, 0, VAR_NAMESPACE, 0, 0); /*demangled_name*/
|
||||||
|
if (!ref_static)
|
||||||
|
{
|
||||||
|
static struct complaint msg = {"\
|
||||||
|
Unable to find symbol for static data field %s\n",
|
||||||
|
0, 0};
|
||||||
|
complain (&msg, sname);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
stype = SYMBOL_TYPE(ref_static);
|
||||||
|
|
||||||
|
/* allocate a new fip */
|
||||||
|
new = (struct nextfield *) xmalloc (sizeof (struct nextfield));
|
||||||
|
make_cleanup (free, new);
|
||||||
|
memset (new, 0, sizeof (struct nextfield));
|
||||||
|
new -> next = fip -> list;
|
||||||
|
fip -> list = new;
|
||||||
|
|
||||||
|
/* set visibility */
|
||||||
|
/* FIXME! no way to tell visibility from stabs??? */
|
||||||
|
new -> visibility = VISIBILITY_PUBLIC;
|
||||||
|
|
||||||
|
/* set field info into fip */
|
||||||
|
fip -> list -> field.type = stype;
|
||||||
|
|
||||||
|
/* set bitpos & bitsize */
|
||||||
|
fip -> list -> field.bitpos = (long) -1; /* -1 signifies a static member */
|
||||||
|
/* YUK! what a hack! bitsize used for physname when field is static */
|
||||||
|
fip -> list -> field.bitsize = (long) savestring (sname, strlen(sname));
|
||||||
|
|
||||||
|
/* set name field */
|
||||||
|
/* The following is code to work around cfront generated stabs.
|
||||||
|
The stabs contains full mangled name for each field.
|
||||||
|
We try to demangle the name and extract the field name out of it.
|
||||||
|
*/
|
||||||
|
if (ARM_DEMANGLING)
|
||||||
|
{
|
||||||
|
char *dem, *dem_p;
|
||||||
|
dem = cplus_demangle (sname, DMGL_ANSI | DMGL_PARAMS);
|
||||||
|
if (dem != NULL)
|
||||||
|
{
|
||||||
|
dem_p = strrchr (dem, ':');
|
||||||
|
if (dem_p != 0 && *(dem_p-1)==':')
|
||||||
|
dem_p++;
|
||||||
|
fip->list->field.name =
|
||||||
|
obsavestring (dem_p, strlen(dem_p), &objfile -> type_obstack);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fip->list->field.name =
|
||||||
|
obsavestring (sname, strlen(sname), &objfile -> type_obstack);
|
||||||
|
}
|
||||||
|
} /* end of code for cfront work around */
|
||||||
|
} /* loop again for next static field */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy structure fields to fip so attach_fields_to_type will work.
|
||||||
|
type has already been created with the initial instance data fields.
|
||||||
|
Now we want to be able to add the other members to the class,
|
||||||
|
so we want to add them back to the fip and reattach them again
|
||||||
|
once we have collected all the class members. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
copy_cfront_struct_fields(fip, type, objfile)
|
||||||
|
struct field_info *fip;
|
||||||
|
struct type *type;
|
||||||
|
struct objfile *objfile;
|
||||||
|
{
|
||||||
|
int nfields = TYPE_NFIELDS(type);
|
||||||
|
int i;
|
||||||
|
struct nextfield * new;
|
||||||
|
|
||||||
|
/* Copy the fields into the list of fips and reset the types
|
||||||
|
to remove the old fields */
|
||||||
|
|
||||||
|
for (i=0; i<nfields; i++)
|
||||||
|
{
|
||||||
|
/* allocate a new fip */
|
||||||
|
new = (struct nextfield *) xmalloc (sizeof (struct nextfield));
|
||||||
|
make_cleanup (free, new);
|
||||||
|
memset (new, 0, sizeof (struct nextfield));
|
||||||
|
new -> next = fip -> list;
|
||||||
|
fip -> list = new;
|
||||||
|
|
||||||
|
/* copy field info into fip */
|
||||||
|
new -> field = TYPE_FIELD (type, i);
|
||||||
|
/* set visibility */
|
||||||
|
if (TYPE_FIELD_PROTECTED (type, i))
|
||||||
|
new -> visibility = VISIBILITY_PROTECTED;
|
||||||
|
else if (TYPE_FIELD_PRIVATE (type, i))
|
||||||
|
new -> visibility = VISIBILITY_PRIVATE;
|
||||||
|
else
|
||||||
|
new -> visibility = VISIBILITY_PUBLIC;
|
||||||
|
}
|
||||||
|
/* Now delete the fields from the type since we will be
|
||||||
|
allocing new space once we get the rest of the fields
|
||||||
|
in attach_fields_to_type.
|
||||||
|
The pointer TYPE_FIELDS(type) is left dangling but should
|
||||||
|
be freed later by objstack_free */
|
||||||
|
TYPE_FIELDS (type)=0;
|
||||||
|
TYPE_NFIELDS (type) = 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create the vector of fields, and record how big it is.
|
/* Create the vector of fields, and record how big it is.
|
||||||
We need this info to record proper virtual function table information
|
We need this info to record proper virtual function table information
|
||||||
for this class's virtual functions. */
|
for this class's virtual functions. */
|
||||||
|
|
Loading…
Reference in New Issue