mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-12-02 00:56:27 +00:00
* 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:
parent
20924a554d
commit
4af8819895
@ -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.
|
||||||
|
@ -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:
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user