PR ld/12549
[binutils-gdb.git] / gdb / ada-valprint.c
index 1ec62ced48fc183f02b9888b085e2bd4b4411ad5..5287ce57248cfc6605bf070a1f934b0949fd6dde 100644 (file)
@@ -1,7 +1,6 @@
 /* Support for printing Ada values for GDB, the GNU debugger.
 
-   Copyright (C) 1986, 1988-1989, 1991-1994, 1997, 2001-2012 Free
-   Software Foundation, Inc.
+   Copyright (C) 1986-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -109,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:
@@ -321,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);
 
@@ -330,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.  */
 
@@ -402,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;
            }
@@ -510,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);
@@ -529,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),
@@ -543,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);
@@ -730,9 +716,8 @@ 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;
        }
@@ -824,7 +809,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
        for (i = 0; i < len; i++)
          {
            QUIT;
-           if (val == TYPE_FIELD_BITPOS (type, i))
+           if (val == TYPE_FIELD_ENUMVAL (type, i))
              {
                break;
              }
@@ -892,6 +877,9 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
          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;
@@ -905,6 +893,9 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
                                (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),
@@ -1085,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))
        {