Clarify the address and pointer conversions on AVR.
authorPierre Langlois <pierre.langlois@embecosm.com>
Fri, 25 Jul 2014 13:45:03 +0000 (14:45 +0100)
committerPierre Langlois <pierre.langlois@embecosm.com>
Fri, 25 Jul 2014 14:03:29 +0000 (15:03 +0100)
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.

2014-07-25  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/ChangeLog
gdb/avr-tdep.c

index b0c79b5653b774cd23b411daf189d98d91606738..f265915153907271ac8d38897cab123cae646ef5 100644 (file)
@@ -1,3 +1,9 @@
+2014-07-25  Pierre Langlois  <pierre.langlois@embecosm.com>
+
+       * avr-tdep.c (avr_address_to_pointer): Clarify the conversion in the
+       comments.
+       (avr_pointer_to_address): Likewise.
+
 2014-07-24  Tom Tromey  <tromey@redhat.com>
 
        * monitor.c (compile_pattern): Update.
index be0b543e6ffb8753ad1e61a62e887691230ce331..1f268f25639acd25eb0174df35e42c2f3d2e3a14 100644 (file)
@@ -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);
 }