Use XVS field type instead of doing a parallel lookup.
authorJoel Brobecker <brobecker@gnat.com>
Mon, 18 Jan 2010 10:26:02 +0000 (10:26 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Mon, 18 Jan 2010 10:26:02 +0000 (10:26 +0000)
        * ada-lang.c (ada_get_base_type): Follow the XVS field type
        if it is a reference type instead of doing a type lookup using
        the XVS field name.

gdb/ChangeLog
gdb/ada-lang.c

index 505b097..2eb2297 100644 (file)
@@ -1,5 +1,12 @@
 2010-01-18  Joel Brobecker  <brobecker@adacore.com>
 
+       Use XVS field type instead of doing a parallel lookup.
+       * ada-lang.c (ada_get_base_type): Follow the XVS field type
+       if it is a reference type instead of doing a type lookup using
+       the XVS field name.
+
+2010-01-18  Joel Brobecker  <brobecker@adacore.com>
+
        Trust PAD types instead of using PAD___XVS.
        * ada-lang.c (trust_pad_over_xvs): New static variable.
        (ada_is_aligner_type): If !trust_pad_over_xvs and there is a
index e63cf88..4f77600 100644 (file)
@@ -7788,11 +7788,20 @@ ada_get_base_type (struct type *raw_type)
       || TYPE_NFIELDS (real_type_namer) != 1)
     return raw_type;
 
-  raw_real_type = ada_find_any_type (TYPE_FIELD_NAME (real_type_namer, 0));
-  if (raw_real_type == NULL)
-    return raw_type;
-  else
-    return raw_real_type;
+  if (TYPE_CODE (TYPE_FIELD_TYPE (real_type_namer, 0)) != TYPE_CODE_REF)
+    {
+      /* This is an older encoding form where the base type needs to be
+        looked up by name.  We prefer the newer enconding because it is
+        more efficient.  */
+      raw_real_type = ada_find_any_type (TYPE_FIELD_NAME (real_type_namer, 0));
+      if (raw_real_type == NULL)
+       return raw_type;
+      else
+       return raw_real_type;
+    }
+
+  /* The field in our XVS type is a reference to the base type.  */
+  return TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (real_type_namer, 0));
 }
 
 /* The type of value designated by TYPE, with all aligners removed.  */