2005-01-15 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / c-valprint.c
index e1e8b8211b430f97c551d0812ef1bda5c754345b..f0f1663667f10eb6e5e1f57c980efaaa50952a30 100644 (file)
@@ -1,7 +1,7 @@
 /* Support for printing C values for GDB, the GNU debugger.
-   Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   1998, 1999, 2000
-   Free Software Foundation, Inc.
+
+   Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
+   1997, 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -21,6 +21,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
+#include "gdb_string.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "expression.h"
@@ -29,6 +30,7 @@
 #include "language.h"
 #include "c-lang.h"
 #include "cp-abi.h"
+#include "target.h"
 \f
 
 /* Print function pointer with inferior address ADDRESS onto stdio
@@ -37,7 +39,9 @@
 static void
 print_function_pointer_address (CORE_ADDR address, struct ui_file *stream)
 {
-  CORE_ADDR func_addr = CONVERT_FROM_FUNC_PTR_ADDR (address);
+  CORE_ADDR func_addr = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
+                                                           address,
+                                                           &current_target);
 
   /* If the function pointer is represented by a description, print the
      address of the description.  */
@@ -69,7 +73,7 @@ c_val_print (struct type *type, char *valaddr, int embedded_offset,
             CORE_ADDR address, struct ui_file *stream, int format,
             int deref_ref, int recurse, enum val_prettyprint pretty)
 {
-  register unsigned int i = 0; /* Number of characters printed */
+  unsigned int i = 0;  /* Number of characters printed */
   unsigned len;
   struct type *elttype;
   unsigned eltlen;
@@ -168,7 +172,6 @@ c_val_print (struct type *type, char *valaddr, int embedded_offset,
        {
          addr = unpack_pointer (type, valaddr + embedded_offset);
        print_unpacked_pointer:
-         elttype = check_typedef (TYPE_TARGET_TYPE (type));
 
          if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
            {
@@ -205,21 +208,20 @@ c_val_print (struct type *type, char *valaddr, int embedded_offset,
                  (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
                {
                  fputs_filtered (" <", stream);
-                 fputs_filtered (SYMBOL_SOURCE_NAME (msymbol), stream);
+                 fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
                  fputs_filtered (">", stream);
                }
              if (vt_address && vtblprint)
                {
-                 value_ptr vt_val;
+                 struct value *vt_val;
                  struct symbol *wsym = (struct symbol *) NULL;
                  struct type *wtype;
-                 struct symtab *s;
                  struct block *block = (struct block *) NULL;
                  int is_this_fld;
 
                  if (msymbol != NULL)
-                   wsym = lookup_symbol (SYMBOL_NAME (msymbol), block,
-                                         VAR_NAMESPACE, &is_this_fld, &s);
+                   wsym = lookup_symbol (DEPRECATED_SYMBOL_NAME (msymbol), block,
+                                         VAR_DOMAIN, &is_this_fld, NULL);
 
                  if (wsym)
                    {
@@ -229,8 +231,8 @@ c_val_print (struct type *type, char *valaddr, int embedded_offset,
                    {
                      wtype = TYPE_TARGET_TYPE (type);
                    }
-                 vt_val = value_at (wtype, vt_address, NULL);
-                 val_print (VALUE_TYPE (vt_val), VALUE_CONTENTS (vt_val), 0,
+                 vt_val = value_at (wtype, vt_address);
+                 val_print (value_type (vt_val), VALUE_CONTENTS (vt_val), 0,
                             VALUE_ADDRESS (vt_val), stream, format,
                             deref_ref, recurse + 1, pretty);
                  if (pretty)
@@ -275,13 +277,12 @@ c_val_print (struct type *type, char *valaddr, int embedded_offset,
        {
          if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
            {
-             value_ptr deref_val =
+             struct value *deref_val =
              value_at
              (TYPE_TARGET_TYPE (type),
               unpack_pointer (lookup_pointer_type (builtin_type_void),
-                              valaddr + embedded_offset),
-              NULL);
-             val_print (VALUE_TYPE (deref_val),
+                              valaddr + embedded_offset));
+             val_print (value_type (deref_val),
                         VALUE_CONTENTS (deref_val),
                         0,
                         VALUE_ADDRESS (deref_val),
@@ -442,8 +443,12 @@ c_val_print (struct type *type, char *valaddr, int embedded_offset,
       break;
 
     case TYPE_CODE_METHOD:
-      cp_print_class_method (valaddr + embedded_offset, lookup_pointer_type (type), stream);
-      break;
+      {
+       struct value *v = value_at (type, address);
+       cp_print_class_method (VALUE_CONTENTS (value_addr (v)),
+                              lookup_pointer_type (type), stream);
+       break;
+      }
 
     case TYPE_CODE_VOID:
       fprintf_filtered (stream, "void");
@@ -460,6 +465,28 @@ c_val_print (struct type *type, char *valaddr, int embedded_offset,
       fprintf_filtered (stream, "<incomplete type>");
       break;
 
+    case TYPE_CODE_COMPLEX:
+      if (format)
+       print_scalar_formatted (valaddr + embedded_offset,
+                               TYPE_TARGET_TYPE (type),
+                               format, 0, stream);
+      else
+       print_floating (valaddr + embedded_offset, TYPE_TARGET_TYPE (type),
+                       stream);
+      fprintf_filtered (stream, " + ");
+      if (format)
+       print_scalar_formatted (valaddr + embedded_offset
+                               + TYPE_LENGTH (TYPE_TARGET_TYPE (type)),
+                               TYPE_TARGET_TYPE (type),
+                               format, 0, stream);
+      else
+       print_floating (valaddr + embedded_offset
+                       + TYPE_LENGTH (TYPE_TARGET_TYPE (type)),
+                       TYPE_TARGET_TYPE (type),
+                       stream);
+      fprintf_filtered (stream, " * I");
+      break;
+
     default:
       error ("Invalid C/C++ type code %d in symbol table.", TYPE_CODE (type));
     }
@@ -468,10 +495,10 @@ c_val_print (struct type *type, char *valaddr, int embedded_offset,
 }
 \f
 int
-c_value_print (value_ptr val, struct ui_file *stream, int format,
+c_value_print (struct value *val, struct ui_file *stream, int format,
               enum val_prettyprint pretty)
 {
-  struct type *type = VALUE_TYPE (val);
+  struct type *type = value_type (val);
   struct type *real_type;
   int full, top, using_enc;
 
@@ -489,7 +516,7 @@ c_value_print (value_ptr val, struct ui_file *stream, int format,
       if (TYPE_CODE (type) == TYPE_CODE_PTR &&
          TYPE_NAME (type) == NULL &&
          TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL &&
-         STREQ (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char"))
+         strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0)
        {
          /* Print nothing */
        }
@@ -501,9 +528,9 @@ c_value_print (value_ptr val, struct ui_file *stream, int format,
              /* Copy value, change to pointer, so we don't get an
               * error about a non-pointer type in value_rtti_target_type
               */
-             value_ptr temparg;
+             struct value *temparg;
              temparg=value_copy(val);
-             VALUE_TYPE (temparg) = lookup_pointer_type(TYPE_TARGET_TYPE(type));
+             temparg->type = lookup_pointer_type (TYPE_TARGET_TYPE(type));
              val=temparg;
            }
          /* Pointer to class, check real type of object */
@@ -539,7 +566,7 @@ c_value_print (value_ptr val, struct ui_file *stream, int format,
          fprintf_filtered (stream, ") ");
        }
     }
-  if (objectprint && (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_CLASS))
+  if (objectprint && (TYPE_CODE (value_type (val)) == TYPE_CODE_CLASS))
     {
       /* Attempt to determine real type of object */
       real_type = value_rtti_type (val, &full, &top, &using_enc);
@@ -567,7 +594,8 @@ c_value_print (value_ptr val, struct ui_file *stream, int format,
       /* Otherwise, we end up at the return outside this "if" */
     }
 
-  return val_print (type, VALUE_CONTENTS_ALL (val), VALUE_EMBEDDED_OFFSET (val),
-                   VALUE_ADDRESS (val),
+  return val_print (type, VALUE_CONTENTS_ALL (val),
+                   VALUE_EMBEDDED_OFFSET (val),
+                   VALUE_ADDRESS (val) + value_offset (val),
                    stream, format, 1, 0, pretty);
 }
This page took 0.027046 seconds and 4 git commands to generate.