+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):
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);
/* 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;
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 */
#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
VUNSPEC_ARC_SC
VUNSPEC_ARC_LL
VUNSPEC_ARC_BLOCKAGE
+ VUNSPEC_ARC_EH_RETURN
])
(define_constants
[(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")
+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.
--- /dev/null
+/* 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" } } */