[Ada] New functions to decode Ada types and values
authorJoel Brobecker <brobecker@gnat.com>
Wed, 29 Feb 2012 19:44:12 +0000 (19:44 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Wed, 29 Feb 2012 19:44:12 +0000 (19:44 +0000)
This patch introduces two new functions that will be used to support
the implementation of the ada-varobj effort.  The function descriptions
should say it all...

gdb/ChangeLog:

        * ada-lang.h (ada_get_decoded_value, ada_get_decoded_type): Add
        declaration.
        * ada-lang.c (ada_get_decoded_value, ada_get_decoded_type): New
        function.

gdb/ChangeLog
gdb/ada-lang.c
gdb/ada-lang.h

index e2fe0a3836c7e789703d1aeaa0fc12659ca0530e..a937673b270ea6fc0ff3d0ec0117cac4f95739b4 100644 (file)
@@ -1,3 +1,10 @@
+2012-02-29  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-lang.h (ada_get_decoded_value, ada_get_decoded_type): Add
+       declaration.
+       * ada-lang.c (ada_get_decoded_value, ada_get_decoded_type): New
+       function.
+
 2012-02-29  Joel Brobecker  <brobecker@adacore.com>
 
        * ada-lang.c (ada_is_ignored_field): Rewrite wrong comment.
index 6382369aeaac49d4dc72db8c092190461e2156c2..430e7067052e7c270092aa09a1c15543983ed896 100644 (file)
@@ -733,6 +733,46 @@ get_base_type (struct type *type)
     }
   return type;
 }
+
+/* Return a decoded version of the given VALUE.  This means returning
+   a value whose type is obtained by applying all the GNAT-specific
+   encondings, making the resulting type a static but standard description
+   of the initial type.  */
+
+struct value *
+ada_get_decoded_value (struct value *value)
+{
+  struct type *type = ada_check_typedef (value_type (value));
+
+  if (ada_is_array_descriptor_type (type)
+      || (ada_is_constrained_packed_array_type (type)
+          && TYPE_CODE (type) != TYPE_CODE_PTR))
+    {
+      if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)  /* array access type.  */
+        value = ada_coerce_to_simple_array_ptr (value);
+      else
+        value = ada_coerce_to_simple_array (value);
+    }
+  else
+    value = ada_to_fixed_value (value);
+
+  return value;
+}
+
+/* Same as ada_get_decoded_value, but with the given TYPE.
+   Because there is no associated actual value for this type,
+   the resulting type might be a best-effort approximation in
+   the case of dynamic types.  */
+
+struct type *
+ada_get_decoded_type (struct type *type)
+{
+  type = to_static_fixed_type (type);
+  if (ada_is_constrained_packed_array_type (type))
+    type = ada_coerce_to_simple_array_type (type);
+  return type;
+}
+
 \f
 
                                 /* Language Selection */
index 2a6cd57d9f9df51d77ee337c020af01d674e0aa5..d11a624be554d83fef3609d050300e332b9f5c5a 100644 (file)
@@ -210,6 +210,10 @@ extern LONGEST ada_discrete_type_low_bound (struct type *);
 
 extern LONGEST ada_discrete_type_high_bound (struct type *);
 
+extern struct value *ada_get_decoded_value (struct value *value);
+
+extern struct type *ada_get_decoded_type (struct type *type);
+
 extern char *ada_decode_symbol (const struct general_symbol_info*);
 
 extern const char *ada_decode (const char*);