* gdbtypes.c (copy_type): New function.

* gdbtypes.h (copy_type): Add declaration.
        * ada-lang.c (ada_to_fixed_type_1): If there is a parallel XVZ
        variable, then use it.
This commit is contained in:
Joel Brobecker 2008-10-22 20:11:56 +00:00
parent 20924a554d
commit 4af8819895
4 changed files with 71 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2008-10-22 Joel brobecker <brobecker@adacore.com>
* gdbtypes.c (copy_type): New function.
* gdbtypes.h (copy_type): Add declaration.
* ada-lang.c (ada_to_fixed_type_1): If there is a parallel XVZ
variable, then use it.
2008-10-22 Joel Brobecker <brobecker@adacore.com> 2008-10-22 Joel Brobecker <brobecker@adacore.com>
* target.h (struct target_ops): Add new field to_get_ada_task_ptid. * target.h (struct target_ops): Add new field to_get_ada_task_ptid.

View File

@ -7357,6 +7357,46 @@ ada_to_fixed_type_1 (struct type *type, const gdb_byte *valaddr,
if (real_type != NULL) if (real_type != NULL)
return to_fixed_record_type (real_type, valaddr, address, NULL); return to_fixed_record_type (real_type, valaddr, address, NULL);
} }
/* Check to see if there is a parallel ___XVZ variable.
If there is, then it provides the actual size of our type. */
else if (ada_type_name (fixed_record_type) != NULL)
{
char *name = ada_type_name (fixed_record_type);
char *xvz_name = alloca (strlen (name) + 7 /* "___XVZ\0" */);
int xvz_found = 0;
LONGEST size;
sprintf (xvz_name, "%s___XVZ", name);
size = get_int_var_value (xvz_name, &xvz_found);
if (xvz_found && TYPE_LENGTH (fixed_record_type) != size)
{
fixed_record_type = copy_type (fixed_record_type);
TYPE_LENGTH (fixed_record_type) = size;
/* The FIXED_RECORD_TYPE may have be a stub. We have
observed this when the debugging info is STABS, and
apparently it is something that is hard to fix.
In practice, we don't need the actual type definition
at all, because the presence of the XVZ variable allows us
to assume that there must be a XVS type as well, which we
should be able to use later, when we need the actual type
definition.
In the meantime, pretend that the "fixed" type we are
returning is NOT a stub, because this can cause trouble
when using this type to create new types targeting it.
Indeed, the associated creation routines often check
whether the target type is a stub and will try to replace
it, thus using a type with the wrong size. This, in turn,
might cause the new type to have the wrong size too.
Consider the case of an array, for instance, where the size
of the array is computed from the number of elements in
our array multiplied by the size of its element. */
TYPE_STUB (fixed_record_type) = 0;
}
}
return fixed_record_type; return fixed_record_type;
} }
case TYPE_CODE_ARRAY: case TYPE_CODE_ARRAY:

View File

@ -3040,6 +3040,28 @@ copy_type_recursive (struct objfile *objfile,
return new_type; return new_type;
} }
/* Make a copy of the given TYPE, except that the pointer & reference
types are not preserved.
This function assumes that the given type has an associated objfile.
This objfile is used to allocate the new type. */
struct type *
copy_type (const struct type *type)
{
struct type *new_type;
gdb_assert (TYPE_OBJFILE (type) != NULL);
new_type = alloc_type (TYPE_OBJFILE (type));
TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type);
TYPE_LENGTH (new_type) = TYPE_LENGTH (type);
memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type),
sizeof (struct main_type));
return new_type;
}
static struct type * static struct type *
build_flt (int bit, char *name, const struct floatformat **floatformats) build_flt (int bit, char *name, const struct floatformat **floatformats)
{ {

View File

@ -1261,4 +1261,6 @@ extern struct type *copy_type_recursive (struct objfile *objfile,
struct type *type, struct type *type,
htab_t copied_types); htab_t copied_types);
extern struct type *copy_type (const struct type *type);
#endif /* GDBTYPES_H */ #endif /* GDBTYPES_H */