* 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.
This commit is contained in:
David Taylor 2001-02-06 18:07:48 +00:00
parent 0e2534bd04
commit 4603e466c2
2 changed files with 26 additions and 4 deletions

View 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.

View 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);