PARAMS elimination.
[deliverable/binutils-gdb.git] / gdb / c-valprint.c
index f791e4c20deb2f8f20aa93980433da5ac96f3d53..f9dbd033fcb184ba81657f6eef2dcb93903a53f0 100644 (file)
@@ -1,5 +1,5 @@
 /* Support for printing C values for GDB, the GNU debugger.
-   Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+   Copyright 1986, 1988, 1989, 1991-1997, 2000
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -50,7 +50,7 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
      char *valaddr;
      int embedded_offset;
      CORE_ADDR address;
-     GDB_FILE *stream;
+     struct ui_file *stream;
      int format;
      int deref_ref;
      int recurse;
@@ -87,7 +87,7 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
                 elements up to it.  */
              if (stop_print_at_null)
                {
-                 int temp_len;
+                 unsigned int temp_len;
 
                  /* Look for a NULL char. */
                  for (temp_len = 0;
@@ -135,8 +135,9 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
          /* Print the unmangled name if desired.  */
          /* Print vtable entry - we only get here if we ARE using
             -fvtable_thunks.  (Otherwise, look under TYPE_CODE_STRUCT.) */
-         print_address_demangle (extract_address (valaddr + embedded_offset, TYPE_LENGTH (type)),
-                                 stream, demangle);
+         CORE_ADDR addr
+           = extract_typed_address (valaddr + embedded_offset, type);
+         print_address_demangle (addr, stream, demangle);
          break;
        }
       elttype = check_typedef (TYPE_TARGET_TYPE (type));
@@ -249,10 +250,10 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
        }
       if (addressprint)
        {
+         CORE_ADDR addr
+           = extract_typed_address (valaddr + embedded_offset, type);
          fprintf_filtered (stream, "@");
-         print_address_numeric
-           (extract_address (valaddr + embedded_offset,
-                             TARGET_PTR_BIT / HOST_CHAR_BIT), 1, stream);
+         print_address_numeric (addr, 1, stream);
          if (deref_ref)
            fputs_filtered (": ", stream);
        }
@@ -295,11 +296,13 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
          /* Print the unmangled name if desired.  */
          /* Print vtable entry - we only get here if NOT using
             -fvtable_thunks.  (Otherwise, look under TYPE_CODE_PTR.) */
-         print_address_demangle (extract_address (
-                                                valaddr + embedded_offset +
-                          TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8,
-                 TYPE_LENGTH (TYPE_FIELD_TYPE (type, VTBL_FNADDR_OFFSET))),
-                                 stream, demangle);
+         int offset = (embedded_offset +
+                       TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8);
+         struct type *field_type = TYPE_FIELD_TYPE (type, VTBL_FNADDR_OFFSET);
+         CORE_ADDR addr
+           = extract_typed_address (valaddr + offset, field_type);
+
+         print_address_demangle (addr, stream, demangle);
        }
       else
        cp_print_value_fields (type, type, valaddr, embedded_offset, address, stream, format,
@@ -403,10 +406,13 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
        }
       else
        {
-         fprintf_filtered (stream, TYPE_UNSIGNED (type) ? "%u" : "%d",
-                           unpack_long (type, valaddr + embedded_offset));
+         val = unpack_long (type, valaddr + embedded_offset);
+         if (TYPE_UNSIGNED (type))
+           fprintf_filtered (stream, "%u", (unsigned int) val);
+         else
+           fprintf_filtered (stream, "%d", (int) val);
          fputs_filtered (" ", stream);
-         LA_PRINT_CHAR ((unsigned char) unpack_long (type, valaddr + embedded_offset), stream);
+         LA_PRINT_CHAR ((unsigned char) val, stream);
        }
       break;
 
@@ -450,7 +456,7 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
 int
 c_value_print (val, stream, format, pretty)
      value_ptr val;
-     GDB_FILE *stream;
+     struct ui_file *stream;
      int format;
      enum val_prettyprint pretty;
 {
@@ -478,22 +484,40 @@ c_value_print (val, stream, format, pretty)
        }
       else if (objectprint && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS))
        {
+
+         if (TYPE_CODE(type) == TYPE_CODE_REF)
+           {
+             /* 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;
+             temparg=value_copy(val);
+             VALUE_TYPE (temparg) = lookup_pointer_type(TYPE_TARGET_TYPE(type));
+             val=temparg;
+           }
          /* Pointer to class, check real type of object */
          fprintf_filtered (stream, "(");
-         type = value_rtti_target_type (val, &full, &top, &using_enc);
-         if (type)
+          real_type = value_rtti_target_type (val, &full, &top, &using_enc);
+          if (real_type)
            {
              /* RTTI entry found */
-             type = lookup_pointer_type (type);
-             type_print (type, "", stream, -1);
-           }
-         else
-           {
-             /* No RTTI fields, do whatever we can */
-             type = VALUE_ENCLOSING_TYPE (val);
-             type_print (type, "", stream, -1);
-             fprintf_filtered (stream, " ?");
-           }
+              if (TYPE_CODE (type) == TYPE_CODE_PTR)
+                {
+                  /* create a pointer type pointing to the real type */
+                  type = lookup_pointer_type (real_type);
+                }
+              else
+                {
+                  /* create a reference type referencing the real type */
+                  type = lookup_reference_type (real_type);
+                }
+             /* JYG: Need to adjust pointer value. */
+              val->aligner.contents[0] -= top;
+
+              /* Note: When we look up RTTI entries, we don't get any 
+                 information on const or volatile attributes */
+            }
+          type_print (type, "", stream, -1);
          fprintf_filtered (stream, ") ");
        }
       else
@@ -518,6 +542,8 @@ c_value_print (val, stream, format, pretty)
          /* Print out object: enclosing type is same as real_type if full */
          return val_print (VALUE_ENCLOSING_TYPE (val), VALUE_CONTENTS_ALL (val), 0,
                         VALUE_ADDRESS (val), stream, format, 1, 0, pretty);
+          /* Note: When we look up RTTI entries, we don't get any information on
+             const or volatile attributes */
        }
       else if (type != VALUE_ENCLOSING_TYPE (val))
        {
This page took 0.025232 seconds and 4 git commands to generate.