PARAMS elimination.
[deliverable/binutils-gdb.git] / gdb / c-valprint.c
index 07289de0a9c108348f5a3a2c1e82147c02bacc72..f9dbd033fcb184ba81657f6eef2dcb93903a53f0 100644 (file)
@@ -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,
@@ -481,6 +484,17 @@ 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, "(");
           real_type = value_rtti_target_type (val, &full, &top, &using_enc);
@@ -497,6 +511,9 @@ c_value_print (val, stream, format, pretty)
                   /* 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 */
             }
This page took 0.023313 seconds and 4 git commands to generate.