diff options
author | David Taylor <taylor@redhat.com> | 2001-02-06 18:07:48 +0000 |
---|---|---|
committer | David Taylor <taylor@redhat.com> | 2001-02-06 18:07:48 +0000 |
commit | 4603e466c25f063a9d4a821966f7368fefd4524f (patch) | |
tree | 3958905ec0f48325639cd6a21e3540b6f889e48c /gdb | |
parent | 0e2534bd0420626b6bb4949938551c0cc02d3aa8 (diff) | |
download | gdb-4603e466c25f063a9d4a821966f7368fefd4524f.zip gdb-4603e466c25f063a9d4a821966f7368fefd4524f.tar.gz gdb-4603e466c25f063a9d4a821966f7368fefd4524f.tar.bz2 |
* 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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/valops.c | 19 |
2 files changed, 26 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 98d226f..a91d3a0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/valops.c b/gdb/valops.c index b546808..9a90e3d 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); |