Back out change to signals.exp (test_handle_all_print): Add setup_xfail for "alpha...
[deliverable/binutils-gdb.git] / gdb / f-valprint.c
index 73d0f15ca73fe9c640e21ff845028f4d038f9232..1143b9d406bddc266ee827c09fed269f63e6b0d0 100644 (file)
@@ -1,5 +1,5 @@
 /* Support for printing Fortran values for GDB, the GNU debugger.
-   Copyright 1993, 1994 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
    Contributed by Motorola.  Adapted from the C definitions by Farooq Butt
    (fmbutt@engage.sps.mot.com), additionally worked over by Stan Shebs.
 
@@ -17,10 +17,10 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
-#include <string.h>
+#include "gdb_string.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "expression.h"
@@ -33,8 +33,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "gdbcore.h"
 #include "command.h"
 
-extern struct obstack dont_print_obstack;
-
 extern unsigned int print_max; /* No of array elements to print */ 
 
 extern int calc_f77_array_dims PARAMS ((struct type *));
@@ -213,63 +211,9 @@ f77_get_dynamic_length_of_aggregate (type)
   /* Patch in a valid length value. */ 
   
   TYPE_LENGTH (type) =
-    (upper_bound - lower_bound + 1) * TYPE_LENGTH (TYPE_TARGET_TYPE (type));
+    (upper_bound - lower_bound + 1) * TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type)));
 }       
 
-/* Print a FORTRAN COMPLEX value of type TYPE, pointed to in GDB by VALADDR,
-   on STREAM.  which_complex indicates precision, which may be regular,
-   *16, or *32 */
-
-void
-f77_print_cmplx (valaddr, type, stream, which_complex)
-     char *valaddr;
-     struct type *type;
-     FILE *stream;
-     int which_complex;
-{
-  float *f1,*f2;
-  double *d1, *d2;
-  
-  switch (which_complex)
-    {
-    case TARGET_COMPLEX_BIT:
-      f1 = (float *) valaddr;
-      f2 = (float *) (valaddr + sizeof(float));
-      fprintf_filtered (stream, "(%.7e,%.7e)", *f1, *f2);
-      break;
-      
-    case TARGET_DOUBLE_COMPLEX_BIT:
-      d1 = (double *) valaddr;
-      d2 = (double *) (valaddr + sizeof(double));
-      fprintf_filtered (stream, "(%.16e,%.16e)", *d1, *d2);
-      break;
-#if 0
-    case TARGET_EXT_COMPLEX_BIT:
-      fprintf_filtered (stream, "<complex*32 format unavailable, "
-                      "printing raw data>\n");
-      
-      fprintf_filtered (stream, "( [ "); 
-      
-      for (i = 0;i<4;i++)
-       fprintf_filtered (stream, "0x%x ",
-                        * ( (unsigned int *) valaddr+i));
-      
-      fprintf_filtered (stream, "],\n  [ "); 
-      
-      for (i=4;i<8;i++)
-       fprintf_filtered (stream, "0x%x ",
-                        * ((unsigned int *) valaddr+i));
-      
-      fprintf_filtered (stream, "] )");
-      
-      break;
-#endif
-    default:
-      fprintf_filtered (stream, "<cannot handle complex of this type>");
-      break;
-    }
-}
-
 /* Function that sets up the array offset,size table for the array 
    type "type".  */ 
 
@@ -279,7 +223,7 @@ f77_create_arrayprint_offset_tbl (type, stream)
      FILE *stream;
 {
   struct type *tmp_type;
-  int eltlen; 
+  int eltlen;
   int ndimen = 1;
   int upper, lower, retcode; 
   
@@ -300,31 +244,22 @@ f77_create_arrayprint_offset_tbl (type, stream)
       
       F77_DIM_SIZE (ndimen) = upper - lower + 1;
       
-      if (ndimen == 1)
-       F77_DIM_OFFSET (ndimen) = 1;
-      else
-       F77_DIM_OFFSET (ndimen) = 
-         F77_DIM_OFFSET (ndimen - 1) * F77_DIM_SIZE(ndimen - 1);
-      
       tmp_type = TYPE_TARGET_TYPE (tmp_type);
       ndimen++; 
     }
   
-  eltlen = TYPE_LENGTH (tmp_type); 
-
   /* Now we multiply eltlen by all the offsets, so that later we 
      can print out array elements correctly.  Up till now we 
      know an offset to apply to get the item but we also 
      have to know how much to add to get to the next item */
   
-  tmp_type = type; 
-  ndimen = 1
-  
-  while ((TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY)) 
+  ndimen--;
+  eltlen = TYPE_LENGTH (tmp_type)
+  F77_DIM_OFFSET (ndimen) = eltlen;
+  while (--ndimen > 0)
     {
-      F77_DIM_OFFSET (ndimen) *= eltlen; 
-      ndimen++;
-      tmp_type = TYPE_TARGET_TYPE (tmp_type);
+      eltlen *= F77_DIM_SIZE (ndimen + 1);
+      F77_DIM_OFFSET (ndimen) = eltlen;
     }
 }
 
@@ -437,54 +372,16 @@ f_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
      enum val_prettyprint pretty;
 {
   register unsigned int i = 0;         /* Number of characters printed */
-  unsigned len;
   struct type *elttype;
   LONGEST val;
-  char *localstr;
-  char *straddr;
   CORE_ADDR addr;
   
+  CHECK_TYPEDEF (type);
   switch (TYPE_CODE (type))
     {
-    case TYPE_CODE_LITERAL_STRING: 
-      /* It is trivial to print out F77 strings allocated in the 
-        superior process. The address field is actually a 
-        pointer to the bytes of the literal. For an internalvar,
-        valaddr points to a ptr. which points to 
-        VALUE_LITERAL_DATA(value->internalvar->value)
-        and for straight literals (i.e. of the form 'hello world'), 
-        valaddr points a ptr to VALUE_LITERAL_DATA(value). */
-      
-      /* First dereference valaddr.  This relies on valaddr pointing to the
-        aligner union of a struct value (so we are now fetching the
-        literal_data pointer from that union).  FIXME: Is this always
-        true.  */
-
-      straddr = * (char **) valaddr; 
-
-      if (straddr)
-       {
-         len = TYPE_LENGTH (type); 
-         localstr = alloca (len + 1);
-         strncpy (localstr, straddr, len);
-         localstr[len] = '\0'; 
-         fprintf_filtered (stream, "'%s'", localstr);
-       }
-      else
-       fprintf_filtered (stream, "Unable to print literal F77 string");
-      break; 
-      
-      /* Strings are a little bit funny. They can be viewed as 
-        monolithic arrays that are dealt with as atomic data 
-        items. As such they are the only atomic data items whose 
-        contents are not located in the superior process. Instead 
-        instead of having the actual data, they contain pointers 
-        to addresses in the inferior where data is located.  Thus 
-        instead of using valaddr, we use address. */ 
-      
     case TYPE_CODE_STRING: 
       f77_get_dynamic_length_of_aggregate (type);
-      val_print_string (address, TYPE_LENGTH (type), stream);
+      LA_PRINT_STRING (stream, valaddr, TYPE_LENGTH (type), 0);
       break;
       
     case TYPE_CODE_ARRAY:
@@ -507,7 +404,7 @@ f_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
       else
        {
          addr = unpack_pointer (type, valaddr);
-         elttype = TYPE_TARGET_TYPE (type);
+         elttype = check_typedef (TYPE_TARGET_TYPE (type));
          
          if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
            {
@@ -634,60 +531,20 @@ f_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
        }
       break;
       
-    case TYPE_CODE_LITERAL_COMPLEX:
-      /* We know that the literal complex is stored in the superior 
-        process not the inferior and that it is 16 bytes long. 
-        Just like the case above with a literal array, the
-        bytes for the the literal complex number are stored   
-        at the address pointed to by valaddr */ 
-      
-      if (TYPE_LENGTH (type) == 32)
-       error ("Cannot currently print out complex*32 literals");
-      
-      /* First dereference valaddr.  */ 
-      
-      addr = * (CORE_ADDR *) valaddr; 
-      
-      if (addr)
-       {
-         fprintf_filtered (stream, "("); 
-         
-         if (TYPE_LENGTH(type) == 16) 
-           { 
-             fprintf_filtered (stream, "%.16f", * (double *) addr); 
-             fprintf_filtered (stream, ", %.16f", * (double *) 
-                               (addr + sizeof(double)));
-           }
-         else
-           {
-             fprintf_filtered (stream, "%.8f", * (float *) addr); 
-             fprintf_filtered (stream, ", %.8f", * (float *) 
-                               (addr + sizeof(float)));
-           }
-         fprintf_filtered (stream, ") ");             
-       }
-      else
-       fprintf_filtered (stream, "Unable to print literal F77 array");
-      break; 
-      
     case TYPE_CODE_COMPLEX:
       switch (TYPE_LENGTH (type))
        {
-       case 8:
-         f77_print_cmplx (valaddr, type, stream, TARGET_COMPLEX_BIT);
-         break;
-         
-       case 16: 
-         f77_print_cmplx(valaddr, type, stream, TARGET_DOUBLE_COMPLEX_BIT);
-         break; 
-#if 0
-       case 32:
-         f77_print_cmplx(valaddr, type, stream, TARGET_EXT_COMPLEX_BIT);
-         break; 
-#endif
+       case 8:  type = builtin_type_f_real;  break;
+       case 16:  type = builtin_type_f_real_s8;  break;
+       case 32:  type = builtin_type_f_real_s16;  break;
        default:
          error ("Cannot print out complex*%d variables", TYPE_LENGTH(type)); 
        }
+      fputs_filtered ("(", stream);
+      print_floating (valaddr, type, stream);
+      fputs_filtered (",", stream);
+      print_floating (valaddr, type, stream);
+      fputs_filtered (")", stream);
       break;
       
     case TYPE_CODE_UNDEF:
This page took 0.025184 seconds and 4 git commands to generate.