From: Claudiu Zissulescu Date: Tue, 13 Nov 2018 12:51:19 +0000 (+0100) Subject: [ARC] Update EH code. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3fd6ae8a2541dad32b03c4c039127f0651dbdf1f;p=gcc.git [ARC] Update EH code. Our ABI says the blink is pushed first on stack followed by an unknown number of register saves, and finally by fp. Hence we cannot use the EH_RETURN_ADDRESS macro as the stack is not finalized at that moment. The alternative is to use the eh_return pattern and to initialize all the bits after register allocation when the stack layout is finalized. gcc/ xxxx-xx-xx Claudiu Zissulescu * config/arc/arc.c (arc_eh_return_address_location): Repurpose it to fit the eh_return pattern. * config/arc/arc.md (eh_return): Define. (VUNSPEC_ARC_EH_RETURN): Likewise. * config/arc/arc-protos.h (arc_eh_return_address_location): Match new implementation. * config/arc/arc.h (EH_RETURN_HANDLER_RTX): Remove it. testsuite/ xxxx-xx-xx Claudiu Zissulescu * gcc.target/arc/builtin_eh.c: New test. From-SVN: r266066 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d904d9dc68..5683289a8d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2018-11-13 Claudiu Zissulescu + + * config/arc/arc.c (arc_eh_return_address_location): Repurpose it + to fit the eh_return pattern. + * config/arc/arc.md (eh_return): Define. + (VUNSPEC_ARC_EH_RETURN): Likewise. + * config/arc/arc-protos.h (arc_eh_return_address_location): Match + new implementation. + * config/arc/arc.h (EH_RETURN_HANDLER_RTX): Remove it. + + 2018-11-13 Claudiu Zissulescu * common/config/arc/arc-common.c (arc_option_optimization_table): diff --git a/gcc/config/arc/arc-protos.h b/gcc/config/arc/arc-protos.h index e653f7f3ae0..a9de6d534f6 100644 --- a/gcc/config/arc/arc-protos.h +++ b/gcc/config/arc/arc-protos.h @@ -109,7 +109,7 @@ extern bool arc_legitimize_reload_address (rtx *, machine_mode, int, int); extern void arc_secondary_reload_conv (rtx, rtx, rtx, bool); extern void arc_cpu_cpp_builtins (cpp_reader *); extern bool arc_store_addr_hazard_p (rtx_insn *, rtx_insn *); -extern rtx arc_eh_return_address_location (void); +extern void arc_eh_return_address_location (rtx); extern bool arc_is_jli_call_p (rtx); extern void arc_file_end (void); extern bool arc_is_secure_call_p (rtx); diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c index 75c2384eede..dbe6ff51637 100644 --- a/gcc/config/arc/arc.c +++ b/gcc/config/arc/arc.c @@ -3947,10 +3947,13 @@ arc_check_multi (rtx op, bool push_p) /* Return rtx for the location of the return address on the stack, suitable for use in __builtin_eh_return. The new return address will be written to this location in order to redirect the return to - the exception handler. */ + the exception handler. Our ABI says the blink is pushed first on + stack followed by an unknown number of register saves, and finally + by fp. Hence we cannot use the EH_RETURN_ADDRESS macro as the + stack is not finalized. */ -rtx -arc_eh_return_address_location (void) +void +arc_eh_return_address_location (rtx source) { rtx mem; int offset; @@ -3978,8 +3981,8 @@ arc_eh_return_address_location (void) remove this store seems perfectly sensible. Marking the memory address as volatile obviously has the effect of preventing DSE from removing the store. */ - MEM_VOLATILE_P (mem) = 1; - return mem; + MEM_VOLATILE_P (mem) = true; + emit_move_insn (mem, source); } /* PIC */ diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h index 58d66d74ebc..6e9b1e5ddb6 100644 --- a/gcc/config/arc/arc.h +++ b/gcc/config/arc/arc.h @@ -1391,8 +1391,6 @@ do { \ #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, 2) -#define EH_RETURN_HANDLER_RTX arc_eh_return_address_location () - /* Turn off splitting of long stabs. */ #define DBX_CONTIN_LENGTH 0 diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md index dc0a65cce3a..830236242e0 100644 --- a/gcc/config/arc/arc.md +++ b/gcc/config/arc/arc.md @@ -163,6 +163,7 @@ VUNSPEC_ARC_SC VUNSPEC_ARC_LL VUNSPEC_ARC_BLOCKAGE + VUNSPEC_ARC_EH_RETURN ]) (define_constants @@ -6608,6 +6609,20 @@ core_3, archs4x, archs4xd, archs4xd_slow" [(set_attr "type" "call_no_delay_slot") (set_attr "length" "2")]) +;; Patterns for exception handling +(define_insn_and_split "eh_return" + [(unspec_volatile [(match_operand:SI 0 "register_operand" "r")] + VUNSPEC_ARC_EH_RETURN)] + "" + "#" + "reload_completed" + [(const_int 0)] + " + { + arc_eh_return_address_location (operands[0]); + DONE; + }" +) ;; include the arc-FPX instructions (include "fpx.md") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3e5a8843835..43f542d47c7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-11-13 Claudiu Zissulescu + + * gcc.target/arc/builtin_eh.c: New test. + 2018-11-13 Claudiu Zissulescu * gcc.target/arc/firq-1.c: Update test. diff --git a/gcc/testsuite/gcc.target/arc/builtin_eh.c b/gcc/testsuite/gcc.target/arc/builtin_eh.c new file mode 100644 index 00000000000..717a54bb084 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/builtin_eh.c @@ -0,0 +1,22 @@ +/* Check if we have the right offset for @bar function. */ +/* { dg-options "-O1" } */ + +void bar (void); + +void +foo (int x) +{ + __builtin_unwind_init (); + __builtin_eh_return (x, bar); +} + +/* { dg-final { scan-assembler "r24" } } */ +/* { dg-final { scan-assembler "r22" } } */ +/* { dg-final { scan-assembler "r20" } } */ +/* { dg-final { scan-assembler "r18" } } */ +/* { dg-final { scan-assembler "r16" } } */ +/* { dg-final { scan-assembler "r14" } } */ +/* { dg-final { scan-assembler "r13" } } */ +/* { dg-final { scan-assembler "r0" } } */ +/* { dg-final { scan-assembler "fp" } } */ +/* { dg-final { scan-assembler "fp,64" } } */