[ARC] Update EH code.
authorClaudiu Zissulescu <claziss@synopsys.com>
Tue, 13 Nov 2018 12:51:19 +0000 (13:51 +0100)
committerClaudiu Zissulescu <claziss@gcc.gnu.org>
Tue, 13 Nov 2018 12:51:19 +0000 (13:51 +0100)
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  <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.

testsuite/
xxxx-xx-xx  Claudiu Zissulescu  <claziss@synopsys.com>

* gcc.target/arc/builtin_eh.c: New test.

From-SVN: r266066

gcc/ChangeLog
gcc/config/arc/arc-protos.h
gcc/config/arc/arc.c
gcc/config/arc/arc.h
gcc/config/arc/arc.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arc/builtin_eh.c [new file with mode: 0644]

index 6d904d9dc685e45789d7de85c4c45f5f167376ed..5683289a8d88f086d55af95ac5b6b1791156bda3 100644 (file)
@@ -1,3 +1,14 @@
+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):
index e653f7f3ae0b09bdec1a709088f0e52ac5a57c4b..a9de6d534f69513a99c26e1b5202787a69115757 100644 (file)
@@ -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);
index 75c2384eede8af6307f8998cc61e220745605b2e..dbe6ff51637eb125afae7ae21e2b1046ab4207d0 100644 (file)
@@ -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 */
index 58d66d74ebcc311074dab5bbd09dfd6cd4492dbe..6e9b1e5ddb61a4fa9c746e211d8860dc95f5a8e4 100644 (file)
@@ -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
 
index dc0a65cce3a6b25297e7dca41209e513ee336870..830236242e0ca18232c41df40c20db9fa7e2b400 100644 (file)
   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")
 
index 3e5a88438351b10523e27bd9d22df06d97f049c8..43f542d47c77e7cc9d0ecbbc191158478208d626 100644 (file)
@@ -1,3 +1,7 @@
+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.
diff --git a/gcc/testsuite/gcc.target/arc/builtin_eh.c b/gcc/testsuite/gcc.target/arc/builtin_eh.c
new file mode 100644 (file)
index 0000000..717a54b
--- /dev/null
@@ -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" } } */