diff options
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/arc/arc-protos.h | 2 | ||||
-rw-r--r-- | gcc/config/arc/arc.c | 13 | ||||
-rw-r--r-- | gcc/config/arc/arc.h | 2 | ||||
-rw-r--r-- | gcc/config/arc/arc.md | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arc/builtin_eh.c | 22 |
7 files changed, 61 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d904d9..5683289 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,16 @@ 2018-11-13 Claudiu Zissulescu <claziss@synopsys.com> + * 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 <claziss@synopsys.com> + * common/config/arc/arc-common.c (arc_option_optimization_table): Millicode optimization is default on for size optimizations. * config/arc/arc-protos.h (arc_check_multi): New function. diff --git a/gcc/config/arc/arc-protos.h b/gcc/config/arc/arc-protos.h index e653f7f..a9de6d5 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 75c2384..dbe6ff5 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 58d66d7..6e9b1e5 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 dc0a65c..8302362 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 3e5a884..43f542d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2018-11-13 Claudiu Zissulescu <claziss@synopsys.com> + * gcc.target/arc/builtin_eh.c: New test. + +2018-11-13 Claudiu Zissulescu <claziss@synopsys.com> + * gcc.target/arc/firq-1.c: Update test. * gcc.target/arc/firq-3.c: Likewise. * gcc.target/arc/firq-4.c: Likewise. 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 0000000..717a54b --- /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" } } */ |