dbxread.c (read_type): If we get "##", don't lookup_function_type

and start clobbering it; allocate_stub_method instead.
	* dbxread.c (read_struct_type): Put "op$" instead of "operator"
	in the symbol table.
	* dbxread.c (read_struct_type): Set fcontext to 0 for normal member
	function.
	* dbxread.c (read_struct_type): Initialize name to 0.
	* dbxread.c (read_ofile_symtab, N_CATCH): Add offset to bufp->n_value.
	* dbxread.c (dbx_create_type): Zero TYPE_VPTR_BASETYPE.
	(read_struct_type): Don't bother to set TYPE_VTPR_{BASETYPE,FIELDNO}
	if it's just going to be {0,1}.

	* dbxread.c (virtual_context): Use TYPE_BASECLASS starting at 0
	(yes, it's #if 0, but just in case...).
This commit is contained in:
Jim Kingdon 1991-04-26 22:59:00 +00:00
parent 55838914fd
commit 62c4f98b2b

View File

@ -671,6 +671,7 @@ dbx_create_type ()
bzero (type, sizeof (struct type));
TYPE_VPTR_FIELDNO (type) = -1;
TYPE_VPTR_BASETYPE (type) = 0;
return type;
}
@ -1873,8 +1874,10 @@ read_dbx_symtab (symfile_name, addr,
bufp->n_value += addr; /* Relocate */
SET_NAMESTRING ();
/* Check for __DYNAMIC, which is used by Sun shared libraries.
Record it even if it's local, not global, so we can find it. */
if (namestring[8] == 'C' && (strcmp ("__DYNAMIC", namestring) == 0))
Record it even if it's local, not global, so we can find it.
Same with virtual function tables, both global and static. */
if ((namestring[8] == 'C' && (strcmp ("__DYNAMIC", namestring) == 0))
|| VTBL_PREFIX_P ((namestring+HASH_OFFSET)))
{
/* Not really a function here, but... */
record_misc_function (namestring, bufp->n_value,
@ -2871,8 +2874,7 @@ read_ofile_symtab (desc, stringtab, stringtab_size, sym_offset,
{
/* N_CATCH is not fixed up by the linker, and unfortunately,
there's no other place to put it in the .stab map. */
/* FIXME, do we also have to add OFFSET or something? -- gnu@cygnus */
bufp->n_value += text_offset;
bufp->n_value += text_offset + offset;
}
else if (type == N_TEXT || type == N_DATA || type == N_BSS)
bufp->n_value += offset;
@ -3992,11 +3994,9 @@ read_type (pp)
return_type = read_type (pp);
if (*(*pp)++ != ';')
complain (&invalid_member_complaint, symnum);
type = lookup_function_type (return_type);
type = allocate_stub_method (return_type);
if (typenums[0] != -1)
*dbx_lookup_type (typenums) = type;
TYPE_CODE (type) = TYPE_CODE_METHOD;
TYPE_FLAGS (type) |= TYPE_FLAG_STUB;
}
else
{
@ -4134,7 +4134,7 @@ virtual_context (for_type, type, name, fn_type, offset)
return TYPE_FN_FIELD_FCONTEXT (f, j);
}
}
for (i = TYPE_N_BASECLASSES (type); i > 0; i--)
for (i = TYPE_N_BASECLASSES (type) - 1; i >= 0; i--)
{
basetype = virtual_context (for_type, TYPE_BASECLASS (type, i), name,
fn_type, offset);
@ -4329,7 +4329,7 @@ read_struct_type (pp, type)
/* Special GNU C++ name. */
if (*++p == 'v')
{
char *prefix, *name; /* FIXME: NAME never set! */
char *prefix, *name = 0;
struct type *context;
switch (*++p)
@ -4349,6 +4349,7 @@ read_struct_type (pp, type)
{
if (name == 0)
error ("type name unknown at symtab pos %d.", symnum);
/* FIXME-tiemann: when is `name' ever non-0? */
TYPE_NAME (context) = obsavestring (name, p - name - 1);
}
list->field.name = obconcat (prefix, type_name_no_tag (context), "");
@ -4422,7 +4423,9 @@ read_struct_type (pp, type)
list->field.bitsize = read_number (pp, ';');
#if 0
/* FIXME tiemann: what is the story here? What does the compiler
/* FIXME-tiemann: Can't the compiler put out something which
lets us distinguish these? (or maybe just not put out anything
for the field). What is the story here? What does the compiler
really do? Also, patch gdb.texinfo for this case; I document
it as a possible problem there. Search for "DBX-style". */
@ -4536,8 +4539,8 @@ read_struct_type (pp, type)
/* This lets the user type "break operator+".
We could just put in "+" as the name, but that wouldn't
work for "*". */
static char opname[32] = "operator";
char *o = opname + 8;
static char opname[32] = {'o', 'p', CPLUS_MARKER};
char *o = opname + 3;
/* Skip past '::'. */
p += 2;
@ -4578,7 +4581,7 @@ read_struct_type (pp, type)
*pp = p + 1;
new_sublist->visibility = *(*pp)++ - '0';
if (**pp == '\\') *pp = next_symbol_text ();
/* FIXME: tiemann needs to add const/volatile info
/* FIXME-tiemann: need to add const/volatile info
to the methods. For now, just skip the char.
In future, here's what we need to implement:
@ -4632,6 +4635,7 @@ read_struct_type (pp, type)
/* **pp == '.'. */
/* normal member function. */
new_sublist->fn_field.voffset = 0;
new_sublist->fn_field.fcontext = 0;
break;
}
@ -4733,7 +4737,14 @@ read_struct_type (pp, type)
if (type == t)
{
if (TYPE_FIELD_NAME (t, TYPE_N_BASECLASSES (t)) == 0)
TYPE_VPTR_FIELDNO (type) = i = TYPE_N_BASECLASSES (t);
{
/* 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))
@ -4749,16 +4760,6 @@ read_struct_type (pp, type)
TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (t);
*pp = p + 1;
}
else
{
TYPE_VPTR_BASETYPE (type) = 0;
TYPE_VPTR_FIELDNO (type) = -1;
}
}
else
{
TYPE_VPTR_BASETYPE (type) = 0;
TYPE_VPTR_FIELDNO (type) = -1;
}
return type;
@ -5096,6 +5097,12 @@ read_range_type (pp, typenums)
nbits = n2bits;
}
/* Check for "long long". */
if (got_signed && nbits == TARGET_LONG_LONG_BIT)
return builtin_type_long_long;
if (got_unsigned && nbits == TARGET_LONG_LONG_BIT)
return builtin_type_unsigned_long_long;
if (got_signed || got_unsigned)
{
result_type = (struct type *) obstack_alloc (symbol_obstack,