------- Comment #10 from mmz at gmx dot net  2008-02-07 13:54 -------
(In reply to comment #9)
> is this bug still present in 4.2.2?

I can confirm this bug still exists in 4.2.2 and 4.2.3.

> Acc. to my obervations the error only shows up when not all auto variables can
> be mapped to registers, and additional variables are located on stack. As a
> work-around, if a more complex interrupt handler is needed, place the code in 
> a
> subfunction and call this function from the interrupt handler. In this case no
> stack is reserved in the interrupt handler, and the generated code is OK. Care
> must be taken, of course, that the optimizer does not inline the code for
> IntFunc().

Your subfunction workaround actually did the trick. The generated return
instruction is "ldm sp!, {r0, r1, r2, r3, ip, pc}^". However, if a more complex
interrupt handler is implemented the wrong return instruction generated. The
results seem a bit unpredictable so I currently use plain assembler for my
interrupts.

Example:
extern __attribute__ ((interrupt ("IRQ"))) void
base_int_ctrl_top_irq_handler(void)
{
    int_ctrl_status_t status;

    status.val = READ_REG_U32(ADDR_STATUS_NIRQ);

    if (status.bf.x) {
        puts("Spurious x IRQ!");
    } else if (status.bf.y) {
        puts("Spurious y IRQ!");
    } else if (status.bf.timer) {
        base_timer_interrupt();
    } else if (status.bf.z) {
        puts("Spurious z IRQ!");
    } else {
        puts("Spurious unknown IRQ!");
    }
}

Generated assembly for return:
pop     {r0, r1, r2, r3, ip, lr}
subs    pc, lr, #4      ; 0x4
(and lr was already decremented by 4 when the handler was entered)

So your observations are correct.

Bug #27859 seems to be a duplicate of this bug and contains a patch. However,
this patch is probably not optimal since it just replaces the final "subs" by a
"movs" while the best solution seems to be the "ldmfd ..." instruction above.


-- 

mmz at gmx dot net changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mmz at gmx dot net


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16634

Reply via email to