aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-lang.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2008-10-22 20:11:56 +0000
committerJoel Brobecker <brobecker@gnat.com>2008-10-22 20:11:56 +0000
commit4af8819895fd82c3bfad1163e988f9e9fdc689d6 (patch)
tree00a13e97c123eea52e76fd7e0d9f25060b453dcd /gdb/ada-lang.c
parent20924a554d8569f81a83381e50a5c8057f635870 (diff)
downloadgdb-4af8819895fd82c3bfad1163e988f9e9fdc689d6.zip
gdb-4af8819895fd82c3bfad1163e988f9e9fdc689d6.tar.gz
gdb-4af8819895fd82c3bfad1163e988f9e9fdc689d6.tar.bz2
* 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.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r--gdb/ada-lang.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 60ceacc..cce7da9 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -7357,6 +7357,46 @@ ada_to_fixed_type_1 (struct type *type, const gdb_byte *valaddr,
if (real_type != 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;
}
case TYPE_CODE_ARRAY: