This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] Clarify the address and pointer conversions on AVR.
- From: Pierre Langlois <pierre dot langlois at embecosm dot com>
- To: gdb-patches at sourceware dot org
- Cc: Pierre Langlois <pierre dot langlois at embecosm dot com>
- Date: Wed, 23 Jul 2014 17:30:39 +0100
- Subject: [PATCH] Clarify the address and pointer conversions on AVR.
- Authentication-results: sourceware.org; auth=none
Hi all,
This patch adds additional comments about the conversion of addresses to
pointers and vice-versa on AVR.
Special conversion needs to be done when dealing with an address in the flash
address space, where both code and read-only data can be stored. Code and data
pointers to flash are not addressed the same way:
A code pointer is 16 bit addressed.
A data pointer is 8 bit addressed, even if the data is in flash.
Thanks,
Pierre
2014-07-23 Pierre Langlois <pierre.langlois@embecosm.com>
* avr-tdep.c (avr_address_to_pointer): Clarify the conversion in the
comments.
(avr_pointer_to_address): Likewise.
---
gdb/avr-tdep.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
index be0b543..1f268f2 100644
--- a/gdb/avr-tdep.c
+++ b/gdb/avr-tdep.c
@@ -308,7 +308,7 @@ avr_address_to_pointer (struct gdbarch *gdbarch,
/* Is it a data address in flash? */
if (AVR_TYPE_ADDRESS_CLASS_FLASH (type))
{
- /* A data address in flash is always byte addressed. */
+ /* A data pointer in flash is byte addressed. */
store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order,
avr_convert_iaddr_to_raw (addr));
}
@@ -316,8 +316,8 @@ avr_address_to_pointer (struct gdbarch *gdbarch,
else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC
|| TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD)
{
- /* A code address, either a function pointer or the program counter, is
- word (16 bits) addressed. */
+ /* A code pointer is word (16 bits) addressed. We shift the address down
+ by 1 bit to convert it to a pointer. */
store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order,
avr_convert_iaddr_to_raw (addr >> 1));
}
@@ -339,12 +339,19 @@ avr_pointer_to_address (struct gdbarch *gdbarch,
/* Is it a data address in flash? */
if (AVR_TYPE_ADDRESS_CLASS_FLASH (type))
- return avr_make_iaddr (addr);
+ {
+ /* A data pointer in flash is already byte addressed. */
+ return avr_make_iaddr (addr);
+ }
/* Is it a code address? */
else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC
|| TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD
|| TYPE_CODE_SPACE (TYPE_TARGET_TYPE (type)))
- return avr_make_iaddr (addr << 1);
+ {
+ /* A code pointer is word (16 bits) addressed so we shift it up
+ by 1 bit to convert it to an address. */
+ return avr_make_iaddr (addr << 1);
+ }
else
return avr_make_saddr (addr);
}
--
1.9.3