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

Reply via email to