From 8b945ed2c6ad2d587875b481a4754ad6546d7a8d Mon Sep 17 00:00:00 2001 From: taylor Date: Tue, 6 Feb 2001 18:07:47 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 11 +++++++++++ gdb/valops.c | 19 +++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 98d226f9c4..a91d3a0c28 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 b546808d81..9a90e3d749 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); -- 2.11.0