2013-02-01 Aleksandar Ristovski <aristovski@qnx.com>
[deliverable/binutils-gdb.git] / gdb / ada-valprint.c
index 9381ecca5cdcc5945296bd844ada172610fb5127..5287ce57248cfc6605bf070a1f934b0949fd6dde 100644 (file)
@@ -1,8 +1,6 @@
 /* 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-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -51,10 +49,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.  */
@@ -110,7 +108,7 @@ print_optional_low_bound (struct ui_file *stream, struct type *type,
        return 0;
       break;
     case TYPE_CODE_ENUM:
-      if (low_bound == TYPE_FIELD_BITPOS (index_type, 0))
+      if (low_bound == TYPE_FIELD_ENUMVAL (index_type, 0))
        return 0;
       break;
     case TYPE_CODE_UNDEF:
@@ -322,7 +320,6 @@ ada_print_floating (const gdb_byte *valaddr, struct type *type,
 {
   char buffer[64];
   char *s, *result;
-  int len;
   struct ui_file *tmp_stream = mem_fileopen ();
   struct cleanup *cleanups = make_cleanup_ui_file_delete (tmp_stream);
 
@@ -331,7 +328,6 @@ ada_print_floating (const gdb_byte *valaddr, struct type *type,
   do_cleanups (cleanups);
 
   result = buffer;
-  len = strlen (result);
 
   /* Modify for Ada rules.  */
 
@@ -403,7 +399,7 @@ ada_print_scalar (struct type *type, LONGEST val, struct ui_file *stream)
       len = TYPE_NFIELDS (type);
       for (i = 0; i < len; i++)
        {
-         if (TYPE_FIELD_BITPOS (type, i) == val)
+         if (TYPE_FIELD_ENUMVAL (type, i) == val)
            {
              break;
            }
@@ -511,10 +507,7 @@ printstr (struct ui_file *stream, struct type *elttype, const gdb_byte *string,
        {
          if (in_quotes)
            {
-             if (options->inspect_it)
-               fputs_filtered ("\\\", ", stream);
-             else
-               fputs_filtered ("\", ", stream);
+             fputs_filtered ("\", ", stream);
              in_quotes = 0;
            }
          fputs_filtered ("'", stream);
@@ -530,10 +523,7 @@ printstr (struct ui_file *stream, struct type *elttype, const gdb_byte *string,
        {
          if (!in_quotes)
            {
-             if (options->inspect_it)
-               fputs_filtered ("\\\"", stream);
-             else
-               fputs_filtered ("\"", stream);
+             fputs_filtered ("\"", stream);
              in_quotes = 1;
            }
          ada_emit_char (char_at (string, i, type_len, byte_order),
@@ -544,12 +534,7 @@ printstr (struct ui_file *stream, struct type *elttype, const gdb_byte *string,
 
   /* Terminate the quotes if necessary.  */
   if (in_quotes)
-    {
-      if (options->inspect_it)
-       fputs_filtered ("\\\"", stream);
-      else
-       fputs_filtered ("\"", stream);
-    }
+    fputs_filtered ("\"", stream);
 
   if (force_ellipses || i < length)
     fputs_filtered ("...", stream);
@@ -567,10 +552,9 @@ ada_printstr (struct ui_file *stream, struct type *type,
 
 
 /* See 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 val_print.  */
+   function; they are identical.  */
 
-int
+void
 ada_val_print (struct type *type, const gdb_byte *valaddr,
               int embedded_offset, CORE_ADDR address,
               struct ui_file *stream, int recurse,
@@ -578,52 +562,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 + OFFSET.  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.  */
+   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);
@@ -645,7 +620,6 @@ ada_val_print_array (struct type *type, const gdb_byte *valaddr,
         }
 
       printstr (stream, elttype, valaddr + offset, len, 0, eltlen, options);
-      result = len;
     }
   else
     {
@@ -659,36 +633,36 @@ 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,
                 const struct value *original_value,
                 const struct value_print_options *options)
 {
-  unsigned int len;
   int i;
   struct type *elttype;
-  LONGEST val;
   int offset_aligned;
 
   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
@@ -697,16 +671,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;
@@ -715,13 +688,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))
          {
@@ -733,9 +707,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:
@@ -743,11 +716,10 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
       if (ada_is_fixed_point_type (type))
        {
          LONGEST v = unpack_long (type, valaddr + offset_aligned);
-         int len = TYPE_LENGTH (type);
 
-         fprintf_filtered (stream, len < 4 ? "%.11g" : "%.17g",
+         fprintf_filtered (stream, TYPE_LENGTH (type) < 4 ? "%.11g" : "%.17g",
                            (double) ada_fixed_to_float (type, v));
-         return 0;
+         return;
        }
       else if (TYPE_CODE (type) == TYPE_CODE_RANGE)
        {
@@ -763,16 +735,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
        {
@@ -817,53 +790,53 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
                  ada_printchar (c, type, stream);
                }
            }
-         return 0;
+         return;
        }
 
     case TYPE_CODE_ENUM:
-      if (options->format)
-       {
-         val_print_scalar_formatted (type, valaddr, offset_aligned,
-                                     original_value, options, 0, stream);
-         break;
-       }
-      len = TYPE_NFIELDS (type);
-      val = unpack_long (type, valaddr + offset_aligned);
-      for (i = 0; i < len; i++)
-       {
-         QUIT;
-         if (val == TYPE_FIELD_BITPOS (type, i))
-           {
-             break;
-           }
-       }
-      if (i < len)
-       {
-         const char *name = ada_enum_name (TYPE_FIELD_NAME (type, i));
-
-         if (name[0] == '\'')
-           fprintf_filtered (stream, "%ld %s", (long) val, name);
-         else
-           fputs_filtered (name, stream);
-       }
-      else
-       {
-         print_longest (stream, 'd', 0, val);
-       }
-      break;
+      {
+       unsigned int len;
+       LONGEST val;
 
-    case TYPE_CODE_FLAGS:
-      if (options->format)
-       val_print_scalar_formatted (type, valaddr, offset_aligned,
-                                   original_value, options, 0, stream);
-      else
-       val_print_type_code_flags (type, valaddr + offset_aligned, stream);
-      break;
+       if (options->format)
+         {
+           val_print_scalar_formatted (type, valaddr, offset_aligned,
+                                       original_value, options, 0, stream);
+           break;
+         }
+       len = TYPE_NFIELDS (type);
+       val = unpack_long (type, valaddr + offset_aligned);
+       for (i = 0; i < len; i++)
+         {
+           QUIT;
+           if (val == TYPE_FIELD_ENUMVAL (type, i))
+             {
+               break;
+             }
+         }
+       if (i < len)
+         {
+           const char *name = ada_enum_name (TYPE_FIELD_NAME (type, i));
+
+           if (name[0] == '\'')
+             fprintf_filtered (stream, "%ld %s", (long) val, name);
+           else
+             fputs_filtered (name, stream);
+         }
+       else
+         {
+           print_longest (stream, 'd', 0, val);
+         }
+       break;
+      }
 
     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;
@@ -873,19 +846,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
@@ -897,16 +871,31 @@ 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)
+           {
+             if (ada_is_tagged_type (value_type (deref_val), 1))
+               deref_val = ada_tag_value_at_base_address (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 =
+              deref_val =
                 ada_value_ind (value_from_pointer
                                (lookup_pointer_type (elttype),
                                 deref_val_int));
 
+             if (ada_is_tagged_type (value_type (deref_val), 1))
+               deref_val = ada_tag_value_at_base_address (deref_val);
+
               val_print (value_type (deref_val),
                          value_contents_for_printing (deref_val),
                          value_embedded_offset (deref_val),
@@ -922,7 +911,6 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
       break;
     }
   gdb_flush (stream);
-  return 0;
 }
 
 static int
@@ -950,13 +938,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.  */
@@ -990,14 +978,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
@@ -1088,29 +1076,14 @@ print_field_values (struct type *type, const gdb_byte *valaddr,
        {
          wrap_here (n_spaces (2 + 2 * recurse));
        }
-      if (options->inspect_it)
-       {
-         if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
-           fputs_filtered ("\"( ptr \"", stream);
-         else
-           fputs_filtered ("\"( nodef \"", stream);
-         fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
-                                  language_cplus, DMGL_NO_OPTS);
-         fputs_filtered ("\" \"", stream);
-         fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
-                                  language_cplus, DMGL_NO_OPTS);
-         fputs_filtered ("\") \"", stream);
-       }
-      else
-       {
-         annotate_field_begin (TYPE_FIELD_TYPE (type, i));
-         fprintf_filtered (stream, "%.*s",
-                           ada_name_prefix_len (TYPE_FIELD_NAME (type, i)),
-                           TYPE_FIELD_NAME (type, i));
-         annotate_field_name_end ();
-         fputs_filtered (" => ", stream);
-         annotate_field_value ();
-       }
+
+      annotate_field_begin (TYPE_FIELD_TYPE (type, i));
+      fprintf_filtered (stream, "%.*s",
+                       ada_name_prefix_len (TYPE_FIELD_NAME (type, i)),
+                       TYPE_FIELD_NAME (type, i));
+      annotate_field_name_end ();
+      fputs_filtered (" => ", stream);
+      annotate_field_value ();
 
       if (TYPE_FIELD_PACKED (type, i))
        {
This page took 0.032688 seconds and 4 git commands to generate.