aboutsummaryrefslogtreecommitdiff
path: root/gdb/valops.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@codesourcery.com>2001-07-10 21:15:28 +0000
committerJim Blandy <jimb@codesourcery.com>2001-07-10 21:15:28 +0000
commit2bf1f4a12e3577f7483aaa185c6917d8ba94a9bc (patch)
treea4631ff80eea9522dbd495b60e7282e428f41a7a /gdb/valops.c
parentba3a85231b0063f457e88e57edd12f244b6ceabc (diff)
downloadgdb-2bf1f4a12e3577f7483aaa185c6917d8ba94a9bc.zip
gdb-2bf1f4a12e3577f7483aaa185c6917d8ba94a9bc.tar.gz
gdb-2bf1f4a12e3577f7483aaa185c6917d8ba94a9bc.tar.bz2
* valops.c (value_cast): When casting a pointer to an integer,
don't convert it to an address.
Diffstat (limited to 'gdb/valops.c')
-rw-r--r--gdb/valops.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gdb/valops.c b/gdb/valops.c
index 7cc025d..dc987c4 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -281,7 +281,18 @@ value_cast (struct type *type, register value_ptr arg2)
break; /* fall out and go to normal handling */
}
}
- longest = value_as_long (arg2);
+
+ /* When we cast pointers to integers, we mustn't use
+ POINTER_TO_ADDRESS to find the address the pointer
+ represents, as value_as_long would. GDB should evaluate
+ expressions just as the compiler would --- and the compiler
+ sees a cast as a simple reinterpretation of the pointer's
+ bits. */
+ if (code2 == TYPE_CODE_PTR)
+ longest = extract_unsigned_integer (VALUE_CONTENTS (arg2),
+ TYPE_LENGTH (type2));
+ else
+ longest = value_as_long (arg2);
return value_from_longest (type, convert_to_boolean ?
(LONGEST) (longest ? 1 : 0) : longest);
}