* valprint.c (val_print): Update.
[deliverable/binutils-gdb.git] / gdb / ada-valprint.c
index bd297c6c1f03929347914cf3f54ab19b499901e9..2e44898ca01754c0c36d148bd17d3c2f57eecf2d 100644 (file)
@@ -1,8 +1,7 @@
 /* Support for printing Ada values for GDB, the GNU debugger.
 
-   Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1997, 2001, 2002,
-   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright (C) 1986, 1988-1989, 1991-1994, 1997, 2001-2012 Free
+   Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -51,10 +50,10 @@ static int print_field_values (struct type *, const gdb_byte *,
 
 static void adjust_type_signedness (struct type *);
 
-static int ada_val_print_1 (struct type *, const gdb_byte *, int, CORE_ADDR,
-                           struct ui_file *, int,
-                           const struct value *,
-                           const struct value_print_options *);
+static void ada_val_print_1 (struct type *, const gdb_byte *, int, CORE_ADDR,
+                            struct ui_file *, int,
+                            const struct value *,
+                            const struct value_print_options *);
 \f
 
 /* Make TYPE unsigned if its range of values includes no negatives.  */
@@ -200,7 +199,9 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
                                               (i * bitsize) / HOST_CHAR_BIT,
                                               (i * bitsize) % HOST_CHAR_BIT,
                                               bitsize, elttype);
-         if (memcmp (value_contents (v0), value_contents (v1), eltlen) != 0)
+         if (!value_available_contents_eq (v0, value_embedded_offset (v0),
+                                           v1, value_embedded_offset (v1),
+                                           eltlen))
            break;
        }
 
@@ -564,17 +565,10 @@ ada_printstr (struct ui_file *stream, struct type *type,
 }
 
 
-/* Print data of type TYPE located at VALADDR (within GDB), which came from
-   the inferior at address ADDRESS, onto stdio stream STREAM according to
-   OPTIONS.  The data at VALADDR is in target byte order.
+/* See val_print for a description of the various parameters of this
+   function; they are identical.  */
 
-   If the data is printed as a string, returns the number of string characters
-   printed.
-
-   RECURSE indicates the amount of indentation to supply before
-   continuation lines; this amount is roughly twice the value of RECURSE.  */
-
-int
+void
 ada_val_print (struct type *type, const gdb_byte *valaddr,
               int embedded_offset, CORE_ADDR address,
               struct ui_file *stream, int recurse,
@@ -582,52 +576,43 @@ ada_val_print (struct type *type, const gdb_byte *valaddr,
               const struct value_print_options *options)
 {
   volatile struct gdb_exception except;
-  int result = 0;
 
   /* XXX: this catches QUIT/ctrl-c as well.  Isn't that busted?  */
   TRY_CATCH (except, RETURN_MASK_ALL)
     {
-      result = ada_val_print_1 (type, valaddr, embedded_offset, address,
-                               stream, recurse, val, options);
+      ada_val_print_1 (type, valaddr, embedded_offset, address,
+                      stream, recurse, val, options);
     }
-
-  if (except.reason < 0)
-    result = 0;
-
-  return result;
 }
 
 /* Assuming TYPE is a simple array, print the value of this array located
-   at VALADDR.  See ada_val_print for a description of the various
-   parameters of this function; they are identical.  The semantics
-   of the return value is also identical to ada_val_print.  */
+   at VALADDR + OFFSET.  See ada_val_print for a description of the various
+   parameters of this function; they are identical.  */
 
-static int
+static void
 ada_val_print_array (struct type *type, const gdb_byte *valaddr,
                     int offset, CORE_ADDR address,
                     struct ui_file *stream, int recurse,
                     const struct value *val,
                     const struct value_print_options *options)
 {
-  enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
-  struct type *elttype = TYPE_TARGET_TYPE (type);
-  int result = 0;
-
   /* For an array of chars, print with string syntax.  */
   if (ada_is_string_type (type)
       && (options->format == 0 || options->format == 's'))
     {
+      enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
+      struct type *elttype = TYPE_TARGET_TYPE (type);
       unsigned int eltlen;
       unsigned int len;
 
-      if (elttype == NULL)
-        eltlen = 0;
-      else
-        eltlen = TYPE_LENGTH (elttype);
-      if (eltlen == 0)
-        len = 0;
-      else
-        len = TYPE_LENGTH (type) / eltlen;
+      /* We know that ELTTYPE cannot possibly be null, because we found
+        that TYPE is a string-like type.  Similarly, the size of ELTTYPE
+        should also be non-null, since it's a character-like type.  */
+      gdb_assert (elttype != NULL);
+      gdb_assert (TYPE_LENGTH (elttype) != 0);
+
+      eltlen = TYPE_LENGTH (elttype);
+      len = TYPE_LENGTH (type) / eltlen;
 
       if (options->prettyprint_arrays)
         print_spaces_filtered (2 + 2 * recurse, stream);
@@ -649,7 +634,6 @@ ada_val_print_array (struct type *type, const gdb_byte *valaddr,
         }
 
       printstr (stream, elttype, valaddr + offset, len, 0, eltlen, options);
-      result = len;
     }
   else
     {
@@ -663,14 +647,12 @@ ada_val_print_array (struct type *type, const gdb_byte *valaddr,
                                  stream, recurse, val, options, 0);
       fprintf_filtered (stream, ")");
     }
-
-  return result;
 }
 
 /* See the comment on ada_val_print.  This function differs in that it
    does not catch evaluation errors (leaving that to ada_val_print).  */
 
-static int
+static void
 ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
                 int offset, CORE_ADDR address,
                 struct ui_file *stream, int recurse,
@@ -686,13 +668,17 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
   type = ada_check_typedef (type);
 
   if (ada_is_array_descriptor_type (type)
-      || ada_is_constrained_packed_array_type (type))
+      || (ada_is_constrained_packed_array_type (type)
+         && TYPE_CODE (type) != TYPE_CODE_PTR))
     {
-      int retn;
       struct value *mark = value_mark ();
       struct value *val;
 
       val = value_from_contents_and_address (type, valaddr + offset, address);
+      /* If this is a reference, coerce it now.  This helps taking care
+        of the case where ADDRESS is meaningless because original_value
+        was not an lval.  */
+      val = coerce_ref (val);
       if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)  /* array access type.  */
        val = ada_coerce_to_simple_array_ptr (val);
       else
@@ -701,16 +687,15 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
        {
          gdb_assert (TYPE_CODE (type) == TYPE_CODE_TYPEDEF);
          fprintf_filtered (stream, "0x0");
-         retn = 0;
        }
       else
-       retn = ada_val_print_1 (value_type (val),
-                               value_contents_for_printing (val),
-                               value_embedded_offset (val),
-                               value_address (val), stream, recurse,
-                               val, options);
+       ada_val_print_1 (value_type (val),
+                        value_contents_for_printing (val),
+                        value_embedded_offset (val),
+                        value_address (val), stream, recurse,
+                        val, options);
       value_free_to_mark (mark);
-      return retn;
+      return;
     }
 
   offset_aligned = offset + ada_aligned_value_addr (type, valaddr) - valaddr;
@@ -719,13 +704,14 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
   switch (TYPE_CODE (type))
     {
     default:
-      return c_val_print (type, valaddr, offset, address, stream,
-                         recurse, original_value, options);
+      c_val_print (type, valaddr, offset, address, stream,
+                  recurse, original_value, options);
+      break;
 
     case TYPE_CODE_PTR:
       {
-       int ret = c_val_print (type, valaddr, offset, address,
-                              stream, recurse, original_value, options);
+       c_val_print (type, valaddr, offset, address,
+                    stream, recurse, original_value, options);
 
        if (ada_is_tag_type (type))
          {
@@ -737,9 +723,8 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
 
            if (name != NULL) 
              fprintf_filtered (stream, " (%s)", name);
-           return 0;
-       }
-       return ret;
+         }
+       return;
       }
 
     case TYPE_CODE_INT:
@@ -751,7 +736,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
 
          fprintf_filtered (stream, len < 4 ? "%.11g" : "%.17g",
                            (double) ada_fixed_to_float (type, v));
-         return 0;
+         return;
        }
       else if (TYPE_CODE (type) == TYPE_CODE_RANGE)
        {
@@ -767,16 +752,17 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
                = value_from_contents_and_address (type, valaddr + offset, 0);
              struct value *v = value_cast (target_type, v1);
 
-             return ada_val_print_1 (target_type,
-                                     value_contents_for_printing (v),
-                                     value_embedded_offset (v), 0,
-                                     stream, recurse + 1, v, options);
+             ada_val_print_1 (target_type,
+                              value_contents_for_printing (v),
+                              value_embedded_offset (v), 0,
+                              stream, recurse + 1, v, options);
            }
          else
-           return ada_val_print_1 (TYPE_TARGET_TYPE (type),
-                                   valaddr, offset,
-                                   address, stream, recurse,
-                                   original_value, options);
+           ada_val_print_1 (TYPE_TARGET_TYPE (type),
+                            valaddr, offset,
+                            address, stream, recurse,
+                            original_value, options);
+         return;
        }
       else
        {
@@ -821,7 +807,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
                  ada_printchar (c, type, stream);
                }
            }
-         return 0;
+         return;
        }
 
     case TYPE_CODE_ENUM:
@@ -866,8 +852,11 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
 
     case TYPE_CODE_FLT:
       if (options->format)
-       return c_val_print (type, valaddr, offset, address, stream,
-                           recurse, original_value, options);
+       {
+         c_val_print (type, valaddr, offset, address, stream,
+                      recurse, original_value, options);
+         return;
+       }
       else
        ada_print_floating (valaddr + offset, type, stream);
       break;
@@ -877,19 +866,20 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
       if (ada_is_bogus_array_descriptor (type))
        {
          fprintf_filtered (stream, "(...?)");
-         return 0;
+         return;
        }
       else
        {
          print_record (type, valaddr, offset_aligned,
                        stream, recurse, original_value, options);
-         return 0;
+         return;
        }
 
     case TYPE_CODE_ARRAY:
-      return ada_val_print_array (type, valaddr, offset_aligned,
-                                 address, stream, recurse, original_value,
-                                 options);
+      ada_val_print_array (type, valaddr, offset_aligned,
+                          address, stream, recurse, original_value,
+                          options);
+      return;
 
     case TYPE_CODE_REF:
       /* For references, the debugger is expected to print the value as
@@ -901,9 +891,18 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
       
       if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
         {
-          CORE_ADDR deref_val_int
-           = unpack_pointer (type, valaddr + offset_aligned);
+          CORE_ADDR deref_val_int;
+         struct value *deref_val;
 
+         deref_val = coerce_ref_if_computed (original_value);
+         if (deref_val)
+           {
+             common_val_print (deref_val, stream, recurse + 1, options,
+                               current_language);
+             break;
+           }
+
+          deref_val_int = unpack_pointer (type, valaddr + offset_aligned);
           if (deref_val_int != 0)
             {
               struct value *deref_val =
@@ -926,7 +925,6 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
       break;
     }
   gdb_flush (stream);
-  return 0;
 }
 
 static int
@@ -954,13 +952,13 @@ print_variant_part (struct type *type, int field_num,
        comma_needed, outer_type, outer_offset);
 }
 
-int
+void
 ada_value_print (struct value *val0, struct ui_file *stream,
                 const struct value_print_options *options)
 {
   struct value *val = ada_to_fixed_value (val0);
   CORE_ADDR address = value_address (val);
-  struct type *type = value_type (val);
+  struct type *type = ada_check_typedef (value_type (val));
   struct value_print_options opts;
 
   /* If it is a pointer, indicate what it points to.  */
@@ -994,14 +992,14 @@ ada_value_print (struct value *val0, struct ui_file *stream,
       fprintf_filtered (stream, "(");
       type_print (type, "", stream, -1);
       fprintf_filtered (stream, ") (...?)");
-      return 0;
+      return;
     }
 
   opts = *options;
   opts.deref_ref = 1;
-  return (val_print (type, value_contents_for_printing (val),
-                    value_embedded_offset (val), address,
-                    stream, 0, val, &opts, current_language));
+  val_print (type, value_contents_for_printing (val),
+            value_embedded_offset (val), address,
+            stream, 0, val, &opts, current_language);
 }
 
 static void
@@ -1026,13 +1024,14 @@ print_record (struct type *type, const gdb_byte *valaddr,
   fprintf_filtered (stream, ")");
 }
 
-/* Print out fields of value at VALADDR having structure type TYPE.
+/* Print out fields of value at VALADDR + OFFSET having structure type TYPE.
 
-   TYPE, VALADDR, STREAM, RECURSE, and OPTIONS have the
-   same meanings as in ada_print_value and ada_val_print.
+   TYPE, VALADDR, OFFSET, STREAM, RECURSE, and OPTIONS have the same
+   meanings as in ada_print_value and ada_val_print.
 
-   OUTER_TYPE and OUTER_VALADDR give type and address of enclosing record
-   (used to get discriminant values when printing variant parts).
+   OUTER_TYPE and OUTER_OFFSET give type and address of enclosing
+   record (used to get discriminant values when printing variant
+   parts).
 
    COMMA_NEEDED is 1 if fields have been printed at the current recursion
    level, so that a comma is needed before any field printed by this
This page took 0.028898 seconds and 4 git commands to generate.