With the beta AVR toolchain 3.0.0.207, the prologue for functions using a frame
has changed and is now causing stack corruption when an interrupt fires. Take
for example a function which needs 5 bytes of frame. This is how the frame is
setup in the function prologue:
Under WinAVR2010:
a30: df 93 push r29
a32: cf 93 push r28
a34: 00 d0 rcall .+0 ; 0xa36
a36: 00 d0 rcall .+0 ; 0xa38
a38: 0f 92 push r0
a3a: cd b7 in r28, 0x3d ; 61
a3c: de b7 in r29, 0x3e ; 62
AVR Toolchain 3.0.0.207:
+00000507: 93DF PUSH R29 Push register on stack
+00000508: 93CF PUSH R28 Push register on stack
+00000509: B7CD IN R28,0x3D In from I/O location
+0000050A: B7DE IN R29,0x3E In from I/O location
+0000050B: 9725 SBIW R28,0x05 Subtract immediate from word
+0000050C: BFDE OUT 0x3E,R29 Out to I/O location
+0000050D: BFCD OUT 0x3D,R28
The stack corruption occurs when an interrupt fires between addresses 0x50C and
0x50D in the example above since the stack pointer is only half updated.
I have submitted this as critical since it causes applications to crash
consistently.
--
Summary: Stack corruption with any function using frame
Product: gcc
Version: 4.4.3
Status: UNCONFIRMED
Severity: critical
Priority: P3
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: darkdragon2000 at hotmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45264