From: David Taylor Date: Tue, 6 Feb 2001 18:07:48 +0000 (+0000) Subject: * valops.c (value_cast): If casting a scalar to a pointer, do not X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4603e466c25f063a9d4a821966f7368fefd4524f;p=binutils-gdb.git * 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 98d226f9c4e..a91d3a0c287 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +Tue Feb 6 11:58:57 2001 David Taylor + + * 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 * win32-nat.c: Change PTR to void * throughout. diff --git a/gdb/valops.c b/gdb/valops.c index b546808d816..9a90e3d749a 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -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);