[commit/Ada] array and bounds in fat pointer can be a stub

Joel Brobecker brobecker@adacore.com
Fri Oct 1 16:26:00 GMT 2010


Hello,

This patch adds handling of the case when a fat pointer has the
P_ARRAY and/or P_BOUNDS fields defined as a stub.  In that case,
this stub needs to be resolved.

There are two issues:

  . First, making sure that the resolution takes place itself.
    That's the change to ada_check_typedef.

  . Make sure that the type returned after resolution is not itself
    a typedef.  This is the change to ada_check_typedef.

gdb/ChangeLog (Jerome Guitton, Joel Brobecker):

        * ada-lang.c (desc_bounds): Add handling of the case where
        the P_BOUNDS field is a pointer to a stub.
        (desc_data_target_type): Same for P_ARRAY field.
        (ada_check_typedef): Strip the typedef layers from the type
        found by ada_find_any_type.

Tested on x86_64-linux, and checked in.

---
 gdb/ChangeLog  |    8 ++++++++
 gdb/ada-lang.c |   34 ++++++++++++++++++++++++++++++----
 2 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 3162717..fafee4b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
 2010-10-01  Joel Brobecker  <brobecker@adacore.com>
 
+	* ada-lang.c (desc_bounds): Add handling of the case where
+	the P_BOUNDS field is a pointer to a stub.
+	(desc_data_target_type): Same for P_ARRAY field.
+	(ada_check_typedef): Strip the typedef layers from the type
+	found by ada_find_any_type.
+
+2010-10-01  Joel Brobecker  <brobecker@adacore.com>
+
 	* sparc-tdep.c (sparc32_frame_align): New function.
 	(sparc32_gdbarch_init): Set the frame_align gdbarch method.
 	* sparc64-tdep.c (sparc64_frame_align): New function.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 3eaf649..173e901 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -1491,8 +1491,26 @@ desc_bounds (struct value *arr)
     }
 
   else if (is_thick_pntr (type))
-    return value_struct_elt (&arr, NULL, "P_BOUNDS", NULL,
-                             _("Bad GNAT array descriptor"));
+    {
+      struct value *p_bounds = value_struct_elt (&arr, NULL, "P_BOUNDS", NULL,
+					       _("Bad GNAT array descriptor"));
+      struct type *p_bounds_type = value_type (p_bounds);
+
+      if (p_bounds_type
+	  && TYPE_CODE (p_bounds_type) == TYPE_CODE_PTR)
+	{
+	  struct type *target_type = TYPE_TARGET_TYPE (p_bounds_type);
+
+	  if (TYPE_STUB (target_type))
+	    p_bounds = value_cast (lookup_pointer_type
+				   (ada_check_typedef (target_type)),
+				   p_bounds);
+	}
+      else
+	error (_("Bad GNAT array descriptor"));
+
+      return p_bounds;
+    }
   else
     return NULL;
 }
@@ -1539,7 +1557,7 @@ desc_data_target_type (struct type *type)
 
       if (data_type
 	  && TYPE_CODE (ada_check_typedef (data_type)) == TYPE_CODE_PTR)
-	return TYPE_TARGET_TYPE (data_type);
+	return ada_check_typedef (TYPE_TARGET_TYPE (data_type));
     }
 
   return NULL;
@@ -7636,7 +7654,15 @@ ada_check_typedef (struct type *type)
       char *name = TYPE_TAG_NAME (type);
       struct type *type1 = ada_find_any_type (name);
 
-      return (type1 == NULL) ? type : type1;
+      if (type1 == NULL)
+        return type;
+
+      /* TYPE1 might itself be a TYPE_CODE_TYPEDEF (this can happen with
+	 stubs pointing to arrays, as we don't create symbols for array
+	 types, only for the typedef-to-array types).  This is why
+	 we process TYPE1 with ada_check_typedef before returning
+	 the result.  */
+      return ada_check_typedef (type1);
     }
 }
 
-- 
1.7.1



More information about the Gdb-patches mailing list