Clarify the address and pointer conversions on AVR.

Message ID 1406133039-28166-1-git-send-email-pierre.langlois@embecosm.com
State Committed
Headers

Commit Message

Pierre Langlois July 23, 2014, 4:30 p.m. UTC
  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(-)
  

Comments

Pedro Alves July 24, 2014, 1:35 a.m. UTC | #1
On 07/23/2014 05:30 PM, Pierre Langlois wrote:

> 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.

Looks great.  OK.

Thanks!

Pedro Alves
  

Patch

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);
 }