arc: Fix interrupt's epilogue.
The stack pointer adjustment in interrupt epilogue is happening after restoring the ZOL registers which is wrong. Fixing this. gcc/ * config/arc/arc.cc (arc_expand_epilogue): Adjust the frame pointer first when in interrupts. gcc/testsuite/ * gcc.target/arc/interrupt-13.c: New file. Signed-off-by: Claudiu Zissulescu <claziss@gmail.com>
This commit is contained in:
@@ -3965,7 +3965,7 @@ arc_expand_epilogue (int sibcall_p)
|
||||
if (size)
|
||||
emit_insn (gen_blockage ());
|
||||
|
||||
if (ARC_INTERRUPT_P (fn_type) && restore_fp)
|
||||
if (ARC_INTERRUPT_P (fn_type))
|
||||
{
|
||||
/* We need to restore FP before any SP operation in an
|
||||
interrupt. */
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
extern int foo (int *);
|
||||
|
||||
void __attribute__((interrupt("ilink")))
|
||||
irq (void)
|
||||
{
|
||||
struct {
|
||||
int x0;
|
||||
int x1;
|
||||
} a = {1 ,2};
|
||||
foo ((int *)&a);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler "add_s\\s+sp,sp,8.*pop_s\\s+r0" } } */
|
||||
Reference in New Issue
Block a user