* debug.h (debug_get_type_size): Declare.

(debug_get_field_name): Declare.
	(debug_get_field_bitpos): Declare.
	(debug_get_field_bitsize): Declare.
	(debug_get_field_visibility): Declare.
	(debug_get_field_physname): Declare.
	* debug.c (debug_get_real_type): Handle DEBUG_KIND_TAGGED.
	(debug_get_type_size): New function.
	(debug_get_field_name): New function.
	(debug_get_field_bitpos): New function.
	(debug_get_field_bitsize): New function.
	(debug_get_field_visibility): New function.
	(debug_get_field_physname): New function.
	(debug_write_type): Make sure we pass the real kind, not INDIRECT,
	to tag_type.  Pass the name recursively for INDIRECT.
This commit is contained in:
Ian Lance Taylor
1996-01-23 00:34:58 +00:00
parent d2f5fa493b
commit 35aa91b97d
2 changed files with 136 additions and 9 deletions

View File

@ -2158,6 +2158,7 @@ debug_get_real_type (handle, type)
return debug_get_real_type (handle, *type->u.kindirect->slot); return debug_get_real_type (handle, *type->u.kindirect->slot);
return type; return type;
case DEBUG_KIND_NAMED: case DEBUG_KIND_NAMED:
case DEBUG_KIND_TAGGED:
return debug_get_real_type (handle, type->u.knamed->type); return debug_get_real_type (handle, type->u.knamed->type);
} }
/*NOTREACHED*/ /*NOTREACHED*/
@ -2195,6 +2196,37 @@ debug_get_type_name (handle, type)
return NULL; return NULL;
} }
/* Get the size of a type. */
bfd_vma
debug_get_type_size (handle, type)
PTR handle;
debug_type type;
{
if (type == NULL)
return 0;
/* We don't call debug_get_real_type, because somebody might have
called debug_record_type_size on a named or indirect type. */
if (type->size != 0)
return type->size;
switch (type->kind)
{
default:
return 0;
case DEBUG_KIND_INDIRECT:
if (*type->u.kindirect->slot != NULL)
return debug_get_type_size (handle, *type->u.kindirect->slot);
return 0;
case DEBUG_KIND_NAMED:
case DEBUG_KIND_TAGGED:
return debug_get_type_size (handle, type->u.knamed->type);
}
/*NOTREACHED*/
}
/* Get the return type of a function or method type. */ /* Get the return type of a function or method type. */
debug_type debug_type
@ -2302,6 +2334,70 @@ debug_get_field_type (handle, field)
return NULL; return NULL;
return field->type; return field->type;
} }
/* Get the name of a field. */
/*ARGSUSED*/
const char *
debug_get_field_name (handle, field)
PTR handle;
debug_field field;
{
if (field == NULL)
return NULL;
return field->name;
}
/* Get the bit position of a field. */
/*ARGSUSED*/
bfd_vma
debug_get_field_bitpos (handle, field)
PTR handle;
debug_field field;
{
if (field == NULL || field->static_member)
return (bfd_vma) -1;
return field->u.f.bitpos;
}
/* Get the bit size of a field. */
/*ARGSUSED*/
bfd_vma
debug_get_field_bitsize (handle, field)
PTR handle;
debug_field field;
{
if (field == NULL || field->static_member)
return (bfd_vma) -1;
return field->u.f.bitsize;
}
/* Get the visibility of a field. */
/*ARGSUSED*/
enum debug_visibility
debug_get_field_visibility (handle, field)
PTR handle;
debug_field field;
{
if (field == NULL)
return DEBUG_VISIBILITY_IGNORE;
return field->visibility;
}
/* Get the physical name of a field. */
const char *
debug_get_field_physname (handle, field)
PTR handle;
debug_field field;
{
if (field == NULL || ! field->static_member)
return NULL;
return field->u.s.physname;
}
/* Write out the debugging information. This is given a handle to /* Write out the debugging information. This is given a handle to
debugging information, and a set of function pointers to call. */ debugging information, and a set of function pointers to call. */
@ -2456,8 +2552,13 @@ debug_write_type (info, fns, fhandle, type, name)
if (type->kind == DEBUG_KIND_NAMED) if (type->kind == DEBUG_KIND_NAMED)
return (*fns->typedef_type) (fhandle, type->u.knamed->name->name); return (*fns->typedef_type) (fhandle, type->u.knamed->name->name);
else else
{
struct debug_type *real;
real = debug_get_real_type ((PTR) info, type);
return (*fns->tag_type) (fhandle, type->u.knamed->name->name, 0, return (*fns->tag_type) (fhandle, type->u.knamed->name->name, 0,
type->u.knamed->type->kind); real->kind);
}
} }
/* Mark the name after we have already looked for a known name, so /* Mark the name after we have already looked for a known name, so
@ -2485,7 +2586,7 @@ debug_write_type (info, fns, fhandle, type, name)
if (*type->u.kindirect->slot == DEBUG_TYPE_NULL) if (*type->u.kindirect->slot == DEBUG_TYPE_NULL)
return (*fns->empty_type) (fhandle); return (*fns->empty_type) (fhandle);
return debug_write_type (info, fns, fhandle, *type->u.kindirect->slot, return debug_write_type (info, fns, fhandle, *type->u.kindirect->slot,
(struct debug_name *) NULL); name);
case DEBUG_KIND_VOID: case DEBUG_KIND_VOID:
return (*fns->void_type) (fhandle); return (*fns->void_type) (fhandle);
case DEBUG_KIND_INT: case DEBUG_KIND_INT:

View File

@ -645,9 +645,9 @@ extern debug_type debug_make_undefined_tagged_type
/* Make a base class for an object. The second argument is the base /* Make a base class for an object. The second argument is the base
class type. The third argument is the bit position of this base class type. The third argument is the bit position of this base
class in the object (always 0 unless doing multiple inheritance). class in the object. The fourth argument is whether this is a
The fourth argument is whether this is a virtual class. The fifth virtual class. The fifth argument is the visibility of the base
argument is the visibility of the base class. */ class. */
extern debug_baseclass debug_make_baseclass extern debug_baseclass debug_make_baseclass
PARAMS ((PTR, debug_type, bfd_vma, boolean, enum debug_visibility)); PARAMS ((PTR, debug_type, bfd_vma, boolean, enum debug_visibility));
@ -687,9 +687,7 @@ extern debug_method debug_make_method
a const function. The sixth argument is whether this is a volatile a const function. The sixth argument is whether this is a volatile
function. The seventh argument is the offset in the virtual function. The seventh argument is the offset in the virtual
function table, if any. The eighth argument is the virtual function table, if any. The eighth argument is the virtual
function context. FIXME: Are the const and volatile arguments function context. */
necessary? Could we just use debug_make_const_type? The handling
of the second argument is biased toward the way that stabs works. */
extern debug_method_variant debug_make_method_variant extern debug_method_variant debug_make_method_variant
PARAMS ((PTR, const char *, debug_type, enum debug_visibility, boolean, PARAMS ((PTR, const char *, debug_type, enum debug_visibility, boolean,
@ -733,6 +731,10 @@ extern enum debug_type_kind debug_get_type_kind PARAMS ((PTR, debug_type));
extern const char *debug_get_type_name PARAMS ((PTR, debug_type)); extern const char *debug_get_type_name PARAMS ((PTR, debug_type));
/* Get the size of a type. */
extern bfd_vma debug_get_type_size PARAMS ((PTR, debug_type));
/* Get the return type of a function or method type. */ /* Get the return type of a function or method type. */
extern debug_type debug_get_return_type PARAMS ((PTR, debug_type)); extern debug_type debug_get_return_type PARAMS ((PTR, debug_type));
@ -762,6 +764,30 @@ extern const debug_field *debug_get_fields PARAMS ((PTR, debug_type));
extern debug_type debug_get_field_type PARAMS ((PTR, debug_field)); extern debug_type debug_get_field_type PARAMS ((PTR, debug_field));
/* Get the name of a field. */
extern const char *debug_get_field_name PARAMS ((PTR, debug_field));
/* Get the bit position of a field within the containing structure.
If the field is a static member, this will return (bfd_vma) -1. */
extern bfd_vma debug_get_field_bitpos PARAMS ((PTR, debug_field));
/* Get the bit size of a field. If the field is a static member, this
will return (bfd_vma) -1. */
extern bfd_vma debug_get_field_bitsize PARAMS ((PTR, debug_field));
/* Get the visibility of a field. */
extern enum debug_visibility debug_get_field_visibility
PARAMS ((PTR, debug_field));
/* Get the physical name of a field, if it is a static member. If the
field is not a static member, this will return NULL. */
extern const char *debug_get_field_physname PARAMS ((PTR, debug_field));
/* Write out the recorded debugging information. This takes a set of /* Write out the recorded debugging information. This takes a set of
function pointers which are called to do the actual writing. The function pointers which are called to do the actual writing. The
first PTR is the debugging handle. The second PTR is a handle first PTR is the debugging handle. The second PTR is a handle