gdb: make avr_integer_to_address generate code or data address based on type
authorCristiano De Alti <cristiano_dealti@hotmail.com>
Mon, 25 May 2020 15:55:56 +0000 (11:55 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Mon, 25 May 2020 15:56:14 +0000 (11:56 -0400)
The AVR architecture is a Harvard one, meaning it has different memory
spaces for code and data.  In GDB, this is dealt with by having the data
(SRAM) addresses start at 0x00800000.  When interpreting an integer as
an address (converting to a CORE_ADDR), we currently always generate a
data address.  This doesn't work for some cases described below, where
the integer is meant to represent a code address.

This patch changes avr_integer_to_address so that it generates the
correct type of address (code or data) based on the passed type.

Using the simavr.exp board, I didn't see any regressions when running
the gdb.base/*.exp tests.  A few tests go from fail to pass, but none
from pass to fail.  There are a few new fails and unresolved, but it's
just because some tests manage to make more progress before failing in a
different way.

In practice, it fixes disassembling by address, as described in the PR:

    - (gdb) disassemble 0x12a,0x12b
    - Dump of assembler code from 0x12a to 0x12b:
    -    0x0000012a <main+0>: push    r28
    - End of assembler dump.

    + (gdb) disassemble 0x12a,0x12b
    + Dump of assembler code from 0x80012a to 0x80012b:
    +    0x0080012a:  nop
    + End of assembler dump.

And also, setting a breakpoint by address:

    - (gdb) p &main
    - $1 = (int (*)(void)) 0x12a <main>
    - (gdb) b *0x12a
    - Breakpoint 1 at 0x80012a

    + (gdb) p &main
    + $1 = (int (*)(void)) 0x12a <main>
    + (gdb) b *0x12a
    + Breakpoint 1 at 0x12a: file test-avr.c, line 3.
    + Note: automatically using hardware breakpoints for read-only addresses.

gdb/ChangeLog:

PR gdb/13519
* avr-tdep.c (avr_integer_to_address): Return data or code
address accordingly to the second 'type' argument of the
function.

Change-Id: Iaea1587d053e86f4ab8aebdcabec8d31a6d262cd

gdb/ChangeLog
gdb/avr-tdep.c

index a43ab08dd6c61882815762c51afbb2ea8d74a76d..2e21613640caae623a90515f2da2b80448b2c9e1 100644 (file)
@@ -1,3 +1,10 @@
+2020-05-25  Cristiano De Alti  <cristiano_dealti@hotmail.com>
+
+       PR gdb/13519
+       * avr-tdep.c (avr_integer_to_address): Return data or code
+       address accordingly to the second 'type' argument of the
+       function.
+
 2020-05-25  Michael Weghorn  <m.weghorn@posteo.de>
 
        * infcmd.c, inferior.h: (construct_inferior_arguments):
index fd602e35e50da18e81a9ea3c69da4b1aab972d05..74ab531711e9f0e878041efcc42453397ac91f3a 100644 (file)
@@ -363,7 +363,10 @@ avr_integer_to_address (struct gdbarch *gdbarch,
 {
   ULONGEST addr = unpack_long (type, buf);
 
-  return avr_make_saddr (addr);
+  if (TYPE_DATA_SPACE (type))
+    return avr_make_saddr (addr);
+  else
+    return avr_make_iaddr (addr);
 }
 
 static CORE_ADDR