OSDN Git Service

* valops.c (value_cast): If casting a scalar to a pointer, do not
authortaylor <taylor>
Tue, 6 Feb 2001 18:07:47 +0000 (18:07 +0000)
committertaylor <taylor>
Tue, 6 Feb 2001 18:07:47 +0000 (18:07 +0000)
  issue a message about truncation unless it exceeds the length of
  an address, not the length of a pointer.  This is because what the
  user gives us is an address, not a pointer, and we will ultimately
  convert it (via ADDRESS_TO_POINTER) to a pointer, not truncate it
  to a pointer.  This allows things like "print *(int *)0x01000234"
  to work without generating a misleading message on a target having
  two byte pointers and four byte addresses.

gdb/ChangeLog
gdb/valops.c

index 98d226f..a91d3a0 100644 (file)
@@ -1,3 +1,14 @@
+Tue Feb  6 11:58:57 2001  David Taylor  <taylor@redhat.com>
+
+       * valops.c (value_cast): If casting a scalar to a pointer, do not
+       issue a message about truncation unless it exceeds the length of
+       an address, not the length of a pointer.  This is because what the
+       user gives us is an address, not a pointer, and we will ultimately
+       convert it (via ADDRESS_TO_POINTER) to a pointer, not truncate it
+       to a pointer.  This allows things like "print *(int *)0x01000234"
+       to work without generating a misleading message on a target having
+       two byte pointers and four byte addresses.
+
 2001-02-05  Christopher Faylor  <cgf@cygnus.com>
 
        * win32-nat.c: Change PTR to void * throughout.
index b546808..9a90e3d 100644 (file)
@@ -287,12 +287,23 @@ value_cast (struct type *type, register value_ptr arg2)
                                      code2 == TYPE_CODE_ENUM ||
                                      code2 == TYPE_CODE_RANGE))
     {
-      int ptr_bit = HOST_CHAR_BIT * TYPE_LENGTH (type);
+      /* TYPE_LENGTH (type) is the length of a pointer, but we really
+        want the length of an address! -- we are really dealing with
+        addresses (i.e., gdb representations) not pointers (i.e.,
+        target representations) here.
+
+        This allows things like "print *(int *)0x01000234" to work
+        without printing a misleading message -- which would
+        otherwise occur when dealing with a target having two byte
+        pointers and four byte addresses.  */
+
+      int addr_bit = TARGET_ADDR_BIT;
+
       LONGEST longest = value_as_long (arg2);
-      if (ptr_bit < sizeof (LONGEST) * HOST_CHAR_BIT)
+      if (addr_bit < sizeof (LONGEST) * HOST_CHAR_BIT)
        {
-         if (longest >= ((LONGEST) 1 << ptr_bit)
-             || longest <= -((LONGEST) 1 << ptr_bit))
+         if (longest >= ((LONGEST) 1 << addr_bit)
+             || longest <= -((LONGEST) 1 << addr_bit))
            warning ("value truncated");
        }
       return value_from_longest (type, longest);