* target.h: Add enum target_waitkind, enum target_signal, and
[deliverable/binutils-gdb.git] / gdb / ch-valprint.c
index c0ec4f79ea63e3cdc4e3281bfa59e53e2bd5b4c6..e1e5929134909013c7277ff4b3562e94c13bb12a 100644 (file)
@@ -26,9 +26,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "value.h"
 #include "language.h"
 #include "demangle.h"
+#include "c-lang.h" /* For c_val_print */
 
 static void
-chill_print_value_fields PARAMS ((struct type *, char *, FILE *, int, int,
+chill_print_value_fields PARAMS ((struct type *, char *, GDB_FILE *, int, int,
                                  enum val_prettyprint, struct type **));
 
 \f
@@ -51,7 +52,7 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
      struct type *type;
      char *valaddr;
      CORE_ADDR address;
-     FILE *stream;
+     GDB_FILE *stream;
      int format;
      int deref_ref;
      int recurse;
@@ -60,7 +61,6 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
   LONGEST val;
   unsigned int i = 0;          /* Number of characters printed.  */
   struct type *elttype;
-  unsigned eltlen;
   CORE_ADDR addr;
 
   switch (TYPE_CODE (type))
@@ -157,7 +157,7 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
        }
       if (addressprint && format != 's')
        {
-         fprintf_filtered (stream, "0x%x", addr);
+         fprintf_filtered (stream, "H'%lx", (unsigned long) addr);
        }
       
       /* For a pointer to char or unsigned char, also print the string
@@ -183,10 +183,6 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
          print_scalar_formatted (valaddr, type, format, 0, stream);
          break;
        }
-      if (addressprint && format != 's')
-       {
-         fprintf_filtered (stream, "0x%x ", addr);
-       }
       i = TYPE_LENGTH (type);
       LA_PRINT_STRING (stream, valaddr, i, 0);
       /* Return number of characters printed, plus one for the terminating
@@ -194,27 +190,128 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
       return (i + (print_max && i != print_max));
       break;
 
+    case TYPE_CODE_BITSTRING:
+    case TYPE_CODE_SET:
+      {
+       struct type *range = TYPE_FIELD_TYPE (type, 0);
+       int low_bound = TYPE_LOW_BOUND (range);
+       int high_bound = TYPE_HIGH_BOUND (range);
+       int i;
+       int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
+       int need_comma = 0;
+       int in_range = 0;
+
+       if (is_bitstring)
+         fputs_filtered ("B'", stream);
+       else
+         fputs_filtered ("[", stream);
+       for (i = low_bound; i <= high_bound; i++)
+         {
+           int element = value_bit_index (type, valaddr, i);
+           if (is_bitstring)
+             fprintf_filtered (stream, "%d", element);
+           else if (element)
+             {
+               if (need_comma)
+                 fputs_filtered (", ", stream);
+               print_type_scalar (TYPE_TARGET_TYPE (range), i, stream);
+               need_comma = 1;
+
+               /* Look for a continuous range of true elements. */
+               if (i+1 <= high_bound && value_bit_index (type, valaddr, ++i))
+                 {
+                   int j = i; /* j is the upper bound so far of the range */
+                   fputs_filtered (":", stream);
+                   while (i+1 <= high_bound
+                          && value_bit_index (type, valaddr, ++i))
+                     j = i;
+                   print_type_scalar (TYPE_TARGET_TYPE (range), j, stream);
+                 }
+             }
+         }
+       if (is_bitstring)
+         fputs_filtered ("'", stream);
+       else
+         fputs_filtered ("]", stream);
+      }
+      break;
+
     case TYPE_CODE_STRUCT:
+      if (chill_is_varying_struct (type))
+       {
+         struct type *inner = TYPE_FIELD_TYPE (type, 1);
+         long length = unpack_long (TYPE_FIELD_TYPE (type, 0), valaddr);
+         char *data_addr = valaddr + TYPE_FIELD_BITPOS (type, 1) / 8;
+         
+         switch (TYPE_CODE (inner))
+           {
+           case TYPE_CODE_STRING:
+             if (length > TYPE_LENGTH (type))
+               {
+                 fprintf_filtered (stream,
+                                   "<dynamic length %d > static length %d>",
+                                   length, TYPE_LENGTH (type));
+                 length > TYPE_LENGTH (type);
+               }
+             LA_PRINT_STRING (stream, data_addr, length, 0);
+             return length;
+           }
+       }
       chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
                                0);
       break;
 
-    case TYPE_CODE_MEMBER:
     case TYPE_CODE_REF:
-    case TYPE_CODE_UNION:
+      if (addressprint)
+        {
+         fprintf_filtered (stream, "LOC(H'%lx)",
+                           unpack_long (builtin_type_int, valaddr));
+         if (deref_ref)
+           fputs_filtered (": ", stream);
+        }
+      /* De-reference the reference.  */
+      if (deref_ref)
+       {
+         if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_UNDEF)
+           {
+             value deref_val =
+               value_at
+                 (TYPE_TARGET_TYPE (type),
+                  unpack_pointer (lookup_pointer_type (builtin_type_void),
+                                  valaddr));
+             val_print (VALUE_TYPE (deref_val),
+                        VALUE_CONTENTS (deref_val),
+                        VALUE_ADDRESS (deref_val), stream, format,
+                        deref_ref, recurse + 1, pretty);
+           }
+         else
+           fputs_filtered ("???", stream);
+       }
+      break;
+
     case TYPE_CODE_ENUM:
-    case TYPE_CODE_FUNC:
-    case TYPE_CODE_VOID:
-    case TYPE_CODE_ERROR:
+      c_val_print (type, valaddr, address, stream, format,
+                  deref_ref, recurse, pretty);
+      break;
+
     case TYPE_CODE_RANGE:
-      error ("Unimplemented chill_val_print support for type %d",
-            TYPE_CODE (type));
+      if (TYPE_TARGET_TYPE (type))
+       chill_val_print (TYPE_TARGET_TYPE (type), valaddr, address, stream,
+                        format, deref_ref, recurse, pretty);
       break;
 
+    case TYPE_CODE_MEMBER:
+    case TYPE_CODE_UNION:
+    case TYPE_CODE_FUNC:
+    case TYPE_CODE_VOID:
+    case TYPE_CODE_ERROR:
     default:
-      error ("Invalid Chill type code %d in symbol table.", TYPE_CODE (type));
+      /* Let's defer printing to the C printer, rather than
+        print an error message.  FIXME! */
+      c_val_print (type, valaddr, address, stream, format,
+                  deref_ref, recurse, pretty);
     }
-  fflush (stream);
+  gdb_flush (stream);
   return (0);
 }
 
@@ -232,7 +329,7 @@ chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
                          dont_print)
      struct type *type;
      char *valaddr;
-     FILE *stream;
+     GDB_FILE *stream;
      int format;
      int recurse;
      enum val_prettyprint pretty;
@@ -243,7 +340,7 @@ chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
 
   check_stub_type (type);
 
-  fprintf_filtered (stream, "(");
+  fprintf_filtered (stream, "[");
   len = TYPE_NFIELDS (type);
   if (len == 0)
     {
@@ -267,9 +364,10 @@ chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
            {
              wrap_here (n_spaces (2 + 2 * recurse));
            }
+         fputs_filtered (".", stream);
          fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
                                   language_chill, DMGL_NO_OPTS);
-         fputs_filtered (" = ", stream);
+         fputs_filtered (": ", stream);
          if (TYPE_FIELD_PACKED (type, i))
            {
              value v;
@@ -295,6 +393,5 @@ chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
          print_spaces_filtered (2 * recurse, stream);
        }
     }
-  fprintf_filtered (stream, ")");
+  fprintf_filtered (stream, "]");
 }
-
This page took 0.025274 seconds and 4 git commands to generate.