Update copyright dates.
[deliverable/binutils-gdb.git] / gdb / ada-valprint.c
index e000411efdd263a27e422dbbba07ec1dce98a985..c67266f90231ee89b68c3ac5a923d322c1a9e0e3 100644 (file)
@@ -1,7 +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
+   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -19,8 +19,8 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#include <ctype.h>
 #include "defs.h"
+#include <ctype.h>
 #include "gdb_string.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "exceptions.h"
 #include "objfiles.h"
 
-/* Encapsulates arguments to ada_val_print.  */
-struct ada_val_print_args
-{
-  struct type *type;
-  const gdb_byte *valaddr0;
-  int embedded_offset;
-  CORE_ADDR address;
-  struct ui_file *stream;
-  int recurse;
-  const struct value_print_options *options;
-};
-
 static void print_record (struct type *, const gdb_byte *, struct ui_file *,
-                         int, const struct value_print_options *);
+                         int,
+                         const struct value *,
+                         const struct value_print_options *);
 
 static int print_field_values (struct type *, const gdb_byte *,
                               struct ui_file *, int,
+                              const struct value *,
                               const struct value_print_options *,
                               int, struct type *,
                               const gdb_byte *);
 
 static void adjust_type_signedness (struct type *);
 
-static int ada_val_print_stub (void *args0);
-
 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 *);
 \f
 
@@ -85,8 +75,8 @@ print_optional_low_bound (struct ui_file *stream, struct type *type,
                          const struct value_print_options *options)
 {
   struct type *index_type;
-  long low_bound;
-  long high_bound;
+  LONGEST low_bound;
+  LONGEST high_bound;
 
   if (options->print_array_indexes)
     return 0;
@@ -131,7 +121,7 @@ print_optional_low_bound (struct ui_file *stream, struct type *type,
       break;
     }
 
-  ada_print_scalar (index_type, (LONGEST) low_bound, stream);
+  ada_print_scalar (index_type, low_bound, stream);
   fprintf_filtered (stream, " => ");
   return 1;
 }
@@ -146,6 +136,7 @@ static void
 val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
                                 int bitoffset, struct ui_file *stream,
                                 int recurse,
+                                const struct value *val,
                                 const struct value_print_options *options)
 {
   unsigned int i;
@@ -163,6 +154,7 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
 
   {
     LONGEST high;
+
     if (get_discrete_bounds (index_type, &low, &high) < 0)
       len = 1;
     else
@@ -213,9 +205,10 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
       if (i - i0 > options->repeat_count_threshold)
        {
          struct value_print_options opts = *options;
+
          opts.deref_ref = 0;
          val_print (elttype, value_contents (v0), 0, 0, stream,
-                    recurse + 1, &opts, current_language);
+                    recurse + 1, val, &opts, current_language);
          annotate_elt_rep (i - i0);
          fprintf_filtered (stream, _(" <repeats %u times>"), i - i0);
          annotate_elt_rep_end ();
@@ -225,6 +218,7 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
        {
          int j;
          struct value_print_options opts = *options;
+
          opts.deref_ref = 0;
          for (j = i0; j < i; j += 1)
            {
@@ -244,7 +238,7 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
                                           stream, options);
                }
              val_print (elttype, value_contents (v0), 0, 0, stream,
-                        recurse + 1, &opts, current_language);
+                        recurse + 1, val, &opts, current_language);
              annotate_elt ();
            }
        }
@@ -302,7 +296,7 @@ char_at (const gdb_byte *string, int i, int type_len,
     return (int) extract_unsigned_integer (string + 2 * i, 2, byte_order);
 }
 
-/* Wrapper around memcpy to make it legal argument to ui_file_put */
+/* Wrapper around memcpy to make it legal argument to ui_file_put */
 static void
 ui_memcpy (void *dest, const char *buffer, long len)
 {
@@ -332,7 +326,7 @@ ada_print_floating (const gdb_byte *valaddr, struct type *type,
   len = strlen (result);
 
   /* Modify for Ada rules.  */
-  
+
   s = strstr (result, "inf");
   if (s == NULL)
     s = strstr (result, "Inf");
@@ -459,9 +453,8 @@ ada_print_scalar (struct type *type, LONGEST val, struct ui_file *stream)
 /* Print the character string STRING, printing at most LENGTH characters.
    Printing stops early if the number hits print_max; repeat counts
    are printed as appropriate.  Print ellipses at the end if we
-   had to stop before printing LENGTH characters, or if
-   FORCE_ELLIPSES.   TYPE_LEN is the length (1 or 2) of the character type.
- */
+   had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.
+   TYPE_LEN is the length (1 or 2) of the character type.  */
 
 static void
 printstr (struct ui_file *stream, struct type *elttype, const gdb_byte *string,
@@ -555,8 +548,9 @@ printstr (struct ui_file *stream, struct type *elttype, const gdb_byte *string,
 }
 
 void
-ada_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string,
-             unsigned int length, int force_ellipses,
+ada_printstr (struct ui_file *stream, struct type *type,
+             const gdb_byte *string, unsigned int length,
+             const char *encoding, int force_ellipses,
              const struct value_print_options *options)
 {
   printstr (stream, type, string, length, force_ellipses, TYPE_LENGTH (type),
@@ -578,29 +572,22 @@ int
 ada_val_print (struct type *type, const gdb_byte *valaddr0,
               int embedded_offset, CORE_ADDR address,
               struct ui_file *stream, int recurse,
+              const struct value *val,
               const struct value_print_options *options)
 {
-  struct ada_val_print_args args;
-  args.type = type;
-  args.valaddr0 = valaddr0;
-  args.embedded_offset = embedded_offset;
-  args.address = address;
-  args.stream = stream;
-  args.recurse = recurse;
-  args.options = options;
-
-  return catch_errors (ada_val_print_stub, &args, NULL, RETURN_MASK_ALL);
-}
+  volatile struct gdb_exception except;
+  int result = 0;
 
-/* Helper for ada_val_print; used as argument to catch_errors to
-   unmarshal the arguments to ada_val_print_1, which does the work.  */
-static int
-ada_val_print_stub (void *args0)
-{
-  struct ada_val_print_args *argsp = (struct ada_val_print_args *) args0;
-  return ada_val_print_1 (argsp->type, argsp->valaddr0,
-                         argsp->embedded_offset, argsp->address,
-                         argsp->stream, argsp->recurse, argsp->options);
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      result = ada_val_print_1 (type, valaddr0, 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
@@ -611,27 +598,29 @@ ada_val_print_stub (void *args0)
 static int
 ada_val_print_array (struct type *type, const gdb_byte *valaddr,
                     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);
-  unsigned int eltlen;
-  unsigned int len;
   int result = 0;
 
-  if (elttype == NULL)
-    eltlen = 0;
-  else
-    eltlen = TYPE_LENGTH (elttype);
-  if (eltlen == 0)
-    len = 0;
-  else
-    len = TYPE_LENGTH (type) / eltlen;
-
   /* For an array of chars, print with string syntax.  */
   if (ada_is_string_type (type)
       && (options->format == 0 || options->format == 's'))
     {
+      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;
+
       if (options->prettyprint_arrays)
         print_spaces_filtered (2 + 2 * recurse, stream);
 
@@ -659,10 +648,10 @@ ada_val_print_array (struct type *type, const gdb_byte *valaddr,
       print_optional_low_bound (stream, type, options);
       if (TYPE_FIELD_BITSIZE (type, 0) > 0)
         val_print_packed_array_elements (type, valaddr, 0, stream,
-                                         recurse, options);
+                                         recurse, val, options);
       else
         val_print_array_elements (type, valaddr, address, stream,
-                                  recurse, options, 0);
+                                  recurse, val, options, 0);
       fprintf_filtered (stream, ")");
     }
 
@@ -676,12 +665,12 @@ static int
 ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
                 int embedded_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;
-  unsigned int eltlen;
   LONGEST val;
   const gdb_byte *valaddr = valaddr0 + embedded_offset;
 
@@ -693,16 +682,22 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
       int retn;
       struct value *mark = value_mark ();
       struct value *val;
+
       val = value_from_contents_and_address (type, valaddr, address);
-      val = ada_coerce_to_simple_array_ptr (val);
+      if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)  /* array access type.  */
+       val = ada_coerce_to_simple_array_ptr (val);
+      else
+       val = ada_coerce_to_simple_array (val);
       if (val == NULL)
        {
-         fprintf_filtered (stream, "(null)");
+         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 (val), 0,
-                               value_address (val), stream, recurse, options);
+                               value_address (val), stream, recurse,
+                               NULL, options);
       value_free_to_mark (mark);
       return retn;
     }
@@ -715,17 +710,19 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
     {
     default:
       return c_val_print (type, valaddr0, embedded_offset, address, stream,
-                         recurse, options);
+                         recurse, original_value, options);
 
     case TYPE_CODE_PTR:
       {
        int ret = c_val_print (type, valaddr0, embedded_offset, address, 
-                              stream, recurse, options);
+                              stream, recurse, original_value, options);
+
        if (ada_is_tag_type (type))
          {
            struct value *val = 
              value_from_contents_and_address (type, valaddr, address);
            const char *name = ada_tag_name (val);
+
            if (name != NULL) 
              fprintf_filtered (stream, " (%s)", name);
            return 0;
@@ -747,6 +744,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
       else if (TYPE_CODE (type) == TYPE_CODE_RANGE)
        {
          struct type *target_type = TYPE_TARGET_TYPE (type);
+
          if (TYPE_LENGTH (type) != TYPE_LENGTH (target_type))
            {
              /* Obscure case of range type that has different length from
@@ -756,21 +754,25 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
              struct value *v = value_cast (target_type,
                                            value_from_contents_and_address
                                            (type, valaddr, 0));
+
              return ada_val_print_1 (target_type, value_contents (v), 0, 0,
-                                     stream, recurse + 1, options);
+                                     stream, recurse + 1, NULL, options);
            }
          else
            return ada_val_print_1 (TYPE_TARGET_TYPE (type),
                                    valaddr0, embedded_offset,
-                                   address, stream, recurse, options);
+                                   address, stream, recurse,
+                                   original_value, options);
        }
       else
        {
          int format = (options->format ? options->format
                        : options->output_format);
+
          if (format)
            {
              struct value_print_options opts = *options;
+
              opts.format = format;
              print_scalar_formatted (valaddr, type, &opts, 0, stream);
            }
@@ -823,6 +825,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
       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
@@ -844,7 +847,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
     case TYPE_CODE_FLT:
       if (options->format)
        return c_val_print (type, valaddr0, embedded_offset, address, stream,
-                           recurse, options);
+                           recurse, original_value, options);
       else
        ada_print_floating (valaddr0 + embedded_offset, type, stream);
       break;
@@ -858,13 +861,14 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
        }
       else
        {
-         print_record (type, valaddr, stream, recurse, options);
+         print_record (type, valaddr, stream, recurse, original_value,
+                       options);
          return 0;
        }
 
     case TYPE_CODE_ARRAY:
       return ada_val_print_array (type, valaddr, address, stream,
-                                 recurse, options);
+                                 recurse, original_value, options);
 
     case TYPE_CODE_REF:
       /* For references, the debugger is expected to print the value as
@@ -877,16 +881,18 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
       if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
         {
           LONGEST deref_val_int = (LONGEST) unpack_pointer (type, valaddr);
+
           if (deref_val_int != 0)
             {
               struct value *deref_val =
                 ada_value_ind (value_from_longest
                                (lookup_pointer_type (elttype),
                                 deref_val_int));
+
               val_print (value_type (deref_val),
                          value_contents (deref_val), 0,
                          value_address (deref_val), stream, recurse + 1,
-                        options, current_language);
+                        original_value, options, current_language);
             }
           else
             fputs_filtered ("(null)", stream);
@@ -903,7 +909,9 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
 static int
 print_variant_part (struct type *type, int field_num, const gdb_byte *valaddr,
                    struct ui_file *stream, int recurse,
-                   const struct value_print_options *options, int comma_needed,
+                   const struct value *val,
+                   const struct value_print_options *options,
+                   int comma_needed,
                    struct type *outer_type, const gdb_byte *outer_valaddr)
 {
   struct type *var_type = TYPE_FIELD_TYPE (type, field_num);
@@ -916,7 +924,7 @@ print_variant_part (struct type *type, int field_num, const gdb_byte *valaddr,
       (TYPE_FIELD_TYPE (var_type, which),
        valaddr + TYPE_FIELD_BITPOS (type, field_num) / HOST_CHAR_BIT
        + TYPE_FIELD_BITPOS (var_type, which) / HOST_CHAR_BIT,
-       stream, recurse, options,
+       stream, recurse, val, options,
        comma_needed, outer_type, outer_valaddr);
 }
 
@@ -924,12 +932,9 @@ int
 ada_value_print (struct value *val0, struct ui_file *stream,
                 const struct value_print_options *options)
 {
-  const gdb_byte *valaddr = value_contents (val0);
-  CORE_ADDR address = value_address (val0);
-  struct type *type =
-    ada_to_fixed_type (value_type (val0), valaddr, address, NULL, 1);
-  struct value *val =
-    value_from_contents_and_address (type, valaddr, address);
+  struct value *val = ada_to_fixed_value (val0);
+  CORE_ADDR address = value_address (val);
+  struct type *type = value_type (val);
   struct value_print_options opts;
 
   /* If it is a pointer, indicate what it points to.  */
@@ -948,9 +953,15 @@ ada_value_print (struct value *val0, struct ui_file *stream,
     }
   else if (ada_is_array_descriptor_type (type))
     {
-      fprintf_filtered (stream, "(");
-      type_print (type, "", stream, -1);
-      fprintf_filtered (stream, ") ");
+      /* We do not print the type description unless TYPE is an array
+        access type (this is encoded by the compiler as a typedef to
+        a fat pointer - hence the check against TYPE_CODE_TYPEDEF).  */
+      if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
+        {
+         fprintf_filtered (stream, "(");
+         type_print (type, "", stream, -1);
+         fprintf_filtered (stream, ") ");
+       }
     }
   else if (ada_is_bogus_array_descriptor (type))
     {
@@ -963,19 +974,20 @@ ada_value_print (struct value *val0, struct ui_file *stream,
   opts = *options;
   opts.deref_ref = 1;
   return (val_print (type, value_contents (val), 0, address,
-                    stream, 0, &opts, current_language));
+                    stream, 0, val, &opts, current_language));
 }
 
 static void
 print_record (struct type *type, const gdb_byte *valaddr,
              struct ui_file *stream, int recurse,
+             const struct value *val,
              const struct value_print_options *options)
 {
   type = ada_check_typedef (type);
 
   fprintf_filtered (stream, "(");
 
-  if (print_field_values (type, valaddr, stream, recurse, options,
+  if (print_field_values (type, valaddr, stream, recurse, val, options,
                          0, type, valaddr) != 0 && options->pretty)
     {
       fprintf_filtered (stream, "\n");
@@ -1002,6 +1014,7 @@ print_record (struct type *type, const gdb_byte *valaddr,
 static int
 print_field_values (struct type *type, const gdb_byte *valaddr,
                    struct ui_file *stream, int recurse,
+                   const struct value *val,
                    const struct value_print_options *options,
                    int comma_needed,
                    struct type *outer_type, const gdb_byte *outer_valaddr)
@@ -1021,7 +1034,7 @@ print_field_values (struct type *type, const gdb_byte *valaddr,
            print_field_values (TYPE_FIELD_TYPE (type, i),
                                valaddr
                                + TYPE_FIELD_BITPOS (type, i) / HOST_CHAR_BIT,
-                               stream, recurse, options,
+                               stream, recurse, val, options,
                                comma_needed, type, valaddr);
          continue;
        }
@@ -1029,7 +1042,7 @@ print_field_values (struct type *type, const gdb_byte *valaddr,
        {
          comma_needed =
            print_variant_part (type, i, valaddr,
-                               stream, recurse, options, comma_needed,
+                               stream, recurse, val, options, comma_needed,
                                outer_type, outer_valaddr);
          continue;
        }
@@ -1077,8 +1090,7 @@ print_field_values (struct type *type, const gdb_byte *valaddr,
 
          /* Bitfields require special handling, especially due to byte
             order problems.  */
-         if (TYPE_CPLUS_SPECIFIC (type) != NULL
-             && TYPE_FIELD_IGNORE (type, i))
+         if (HAVE_CPLUS_STRUCT (type) && TYPE_FIELD_IGNORE (type, i))
            {
              fputs_filtered (_("<optimized out or zero length>"), stream);
            }
@@ -1097,16 +1109,18 @@ print_field_values (struct type *type, const gdb_byte *valaddr,
              opts = *options;
              opts.deref_ref = 0;
              val_print (TYPE_FIELD_TYPE (type, i), value_contents (v), 0, 0,
-                        stream, recurse + 1, &opts, current_language);
+                        stream, recurse + 1, v,
+                        &opts, current_language);
            }
        }
       else
        {
          struct value_print_options opts = *options;
+
          opts.deref_ref = 0;
          ada_val_print (TYPE_FIELD_TYPE (type, i),
                         valaddr + TYPE_FIELD_BITPOS (type, i) / HOST_CHAR_BIT,
-                        0, 0, stream, recurse + 1, &opts);
+                        0, 0, stream, recurse + 1, val, &opts);
        }
       annotate_field_end ();
     }
This page took 0.029707 seconds and 4 git commands to generate.