This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH][PR/backtrace 16721] Fix erroneous backtrace on AVR


Hi all,

Looking at stack unwinding on AVR, I noticed the current frame was not always correctly
detected from the function prologue.

This bug occurs only with the following prologue, referred to as "Method 2: Adjust stack pointer"
in GCC: gcc/config/avr/avr.c (avr_prologue_setup_frame).

--> push the old frame pointer
  push r28
  push r29

--> allocate new space
  rcall .+0
  push r1

--> move fp <- sp
  in r28, 0x3d
  in r29, 0x3e

GCC uses "rcall .+0" and "push r1" to adjust the stack pointer, "rcall" pushing
automatically 2 or 3 bytes on the stack, depending on the target.

GDB should scan this prologue and find out the size of the frame but it is incorrect by one
because it expects "push r0" and not "push r1".

I believe this register was changed in GCC withcommit 915f904be.

Best,

Pierre

2014-03-18  Pierre Langlois  <pierre.langlois@embecosm.com>

      * avr-tdep.c (avr_scan_prologue): Accept push r1 instruction for small
        stack allocation.

-----------------------------------------------------------------------------------------

GNU gdb (AVR 8-bit toolchain (built 20140310)) 7.7.50.20140318-cvs
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-unknown-linux-gnu --target=avr".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.atmel.com>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) file atmega-test.elf
Reading symbols from atmega-test.elf...done.
(gdb) target remote :51000
Remote debugging using :51000
0x00000116 in multiply (a=25, b=8) at main.c:4
4		return a * b;
(gdb) monitor reset
(gdb) load
Loading section .text, size 0x1a4 lma 0x0
Start address 0x0, load size 420
Transfer rate: 3360 bits in <1 sec, 210 bytes/write.
(gdb) b multiply
Breakpoint 1 at 0x114: file main.c, line 4.
(gdb) c
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000116 in multiply (a=25, b=8) at main.c:4
4		return a * b;
(gdb) bt
#0  0x00000116 in multiply (a=25, b=8) at main.c:4
#1  0x01e00000 in ?? ()
(gdb) q
A debugging session is active.

	Inferior 1 [Remote target] will be killed.

Quit anyway? (y or n)

diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
index 6e58f04..7fb16d1 100644
--- a/gdb/avr-tdep.c
+++ b/gdb/avr-tdep.c
@@ -720,7 +720,7 @@ avr_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
           info->size += gdbarch_tdep (gdbarch)->call_length;
           vpc += 2;
         }
-      else if (insn == 0x920f)  /* push r0 */
+      else if (insn == 0x920f || insn == 0x921f)  /* push r0 or push r1 */
         {
           info->size += 1;
           vpc += 2;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]