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:
Claudiu Zissulescu
2022-07-18 14:32:41 +03:00
parent ce92603fbe
commit 9c8349ee1a
2 changed files with 16 additions and 1 deletions
+1 -1
View File
@@ -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" } } */