aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/config/arc/arc-protos.h2
-rw-r--r--gcc/config/arc/arc.c13
-rw-r--r--gcc/config/arc/arc.h2
-rw-r--r--gcc/config/arc/arc.md15
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/arc/builtin_eh.c22
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" } } */