Commit 95a3fb9d by Richard Sandiford Committed by Richard Sandiford

gcc/

	* target-insns.def (builtin_longjmp, builtin_setjmp_receiver)
	(builtin_setjmp_setup, exception_receiver, nonlocal_goto)
	(nonlocal_goto_receiver): New targetm instruction patterns.
	* builtins.c (expand_builtin_setjmp_setup): Use them instead
	of HAVE_*/gen_* interface.
	(expand_builtin_setjmp_receiver): Likewise.
	(expand_builtin_longjmp, expand_builtin_nonlocal_goto): Likewise.
	* except.c (expand_dw2_landing_pad_for_region): Likewise.

From-SVN: r225422
parent 8684d89d
2015-07-05 Richard Sandiford <richard.sandiford@arm.com> 2015-07-05 Richard Sandiford <richard.sandiford@arm.com>
* target-insns.def (builtin_longjmp, builtin_setjmp_receiver)
(builtin_setjmp_setup, exception_receiver, nonlocal_goto)
(nonlocal_goto_receiver): New targetm instruction patterns.
* builtins.c (expand_builtin_setjmp_setup): Use them instead
of HAVE_*/gen_* interface.
(expand_builtin_setjmp_receiver): Likewise.
(expand_builtin_longjmp, expand_builtin_nonlocal_goto): Likewise.
* except.c (expand_dw2_landing_pad_for_region): Likewise.
2015-07-05 Richard Sandiford <richard.sandiford@arm.com>
* target.def: Add code_for_* hooks. * target.def: Add code_for_* hooks.
* gentarget-def.c (def_target_insn): Add TARGET_CODE_FOR_* macros. * gentarget-def.c (def_target_insn): Add TARGET_CODE_FOR_* macros.
* defaults.h (HAVE_tablejump, gen_tablejump): Delete. * defaults.h (HAVE_tablejump, gen_tablejump): Delete.
......
...@@ -889,10 +889,8 @@ expand_builtin_setjmp_setup (rtx buf_addr, rtx receiver_label) ...@@ -889,10 +889,8 @@ expand_builtin_setjmp_setup (rtx buf_addr, rtx receiver_label)
emit_stack_save (SAVE_NONLOCAL, &stack_save); emit_stack_save (SAVE_NONLOCAL, &stack_save);
/* If there is further processing to do, do it. */ /* If there is further processing to do, do it. */
#ifdef HAVE_builtin_setjmp_setup if (targetm.have_builtin_setjmp_setup ())
if (HAVE_builtin_setjmp_setup) emit_insn (targetm.gen_builtin_setjmp_setup (buf_addr));
emit_insn (gen_builtin_setjmp_setup (buf_addr));
#endif
/* We have a nonlocal label. */ /* We have a nonlocal label. */
cfun->has_nonlocal_label = 1; cfun->has_nonlocal_label = 1;
...@@ -903,7 +901,7 @@ expand_builtin_setjmp_setup (rtx buf_addr, rtx receiver_label) ...@@ -903,7 +901,7 @@ expand_builtin_setjmp_setup (rtx buf_addr, rtx receiver_label)
If RECEIVER_LABEL is NULL, instead contruct a nonlocal goto handler. */ If RECEIVER_LABEL is NULL, instead contruct a nonlocal goto handler. */
void void
expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED) expand_builtin_setjmp_receiver (rtx receiver_label)
{ {
rtx chain; rtx chain;
...@@ -919,9 +917,7 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED) ...@@ -919,9 +917,7 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
/* Now put in the code to restore the frame pointer, and argument /* Now put in the code to restore the frame pointer, and argument
pointer, if needed. */ pointer, if needed. */
#ifdef HAVE_nonlocal_goto if (! targetm.have_nonlocal_goto ())
if (! HAVE_nonlocal_goto)
#endif
{ {
/* First adjust our frame pointer to its actual value. It was /* First adjust our frame pointer to its actual value. It was
previously set to the start of the virtual area corresponding to previously set to the start of the virtual area corresponding to
...@@ -972,17 +968,12 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED) ...@@ -972,17 +968,12 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
} }
#endif #endif
#ifdef HAVE_builtin_setjmp_receiver if (receiver_label != NULL && targetm.have_builtin_setjmp_receiver ())
if (receiver_label != NULL && HAVE_builtin_setjmp_receiver) emit_insn (targetm.gen_builtin_setjmp_receiver (receiver_label));
emit_insn (gen_builtin_setjmp_receiver (receiver_label)); else if (targetm.have_nonlocal_goto_receiver ())
emit_insn (targetm.gen_nonlocal_goto_receiver ());
else else
#endif { /* Nothing */ }
#ifdef HAVE_nonlocal_goto_receiver
if (HAVE_nonlocal_goto_receiver)
emit_insn (gen_nonlocal_goto_receiver ());
else
#endif
{ /* Nothing */ }
/* We must not allow the code we just generated to be reordered by /* We must not allow the code we just generated to be reordered by
scheduling. Specifically, the update of the frame pointer must scheduling. Specifically, the update of the frame pointer must
...@@ -1019,11 +1010,9 @@ expand_builtin_longjmp (rtx buf_addr, rtx value) ...@@ -1019,11 +1010,9 @@ expand_builtin_longjmp (rtx buf_addr, rtx value)
gcc_assert (value == const1_rtx); gcc_assert (value == const1_rtx);
last = get_last_insn (); last = get_last_insn ();
#ifdef HAVE_builtin_longjmp if (targetm.have_builtin_longjmp ())
if (HAVE_builtin_longjmp) emit_insn (targetm.gen_builtin_longjmp (buf_addr));
emit_insn (gen_builtin_longjmp (buf_addr));
else else
#endif
{ {
fp = gen_rtx_MEM (Pmode, buf_addr); fp = gen_rtx_MEM (Pmode, buf_addr);
lab = gen_rtx_MEM (Pmode, plus_constant (Pmode, buf_addr, lab = gen_rtx_MEM (Pmode, plus_constant (Pmode, buf_addr,
...@@ -1037,14 +1026,12 @@ expand_builtin_longjmp (rtx buf_addr, rtx value) ...@@ -1037,14 +1026,12 @@ expand_builtin_longjmp (rtx buf_addr, rtx value)
/* Pick up FP, label, and SP from the block and jump. This code is /* Pick up FP, label, and SP from the block and jump. This code is
from expand_goto in stmt.c; see there for detailed comments. */ from expand_goto in stmt.c; see there for detailed comments. */
#ifdef HAVE_nonlocal_goto if (targetm.have_nonlocal_goto ())
if (HAVE_nonlocal_goto)
/* We have to pass a value to the nonlocal_goto pattern that will /* We have to pass a value to the nonlocal_goto pattern that will
get copied into the static_chain pointer, but it does not matter get copied into the static_chain pointer, but it does not matter
what that value is, because builtin_setjmp does not use it. */ what that value is, because builtin_setjmp does not use it. */
emit_insn (gen_nonlocal_goto (value, lab, stack, fp)); emit_insn (targetm.gen_nonlocal_goto (value, lab, stack, fp));
else else
#endif
{ {
lab = copy_to_reg (lab); lab = copy_to_reg (lab);
...@@ -1166,12 +1153,10 @@ expand_builtin_nonlocal_goto (tree exp) ...@@ -1166,12 +1153,10 @@ expand_builtin_nonlocal_goto (tree exp)
crtl->has_nonlocal_goto = 1; crtl->has_nonlocal_goto = 1;
#ifdef HAVE_nonlocal_goto
/* ??? We no longer need to pass the static chain value, afaik. */ /* ??? We no longer need to pass the static chain value, afaik. */
if (HAVE_nonlocal_goto) if (targetm.have_nonlocal_goto ())
emit_insn (gen_nonlocal_goto (const0_rtx, r_label, r_sp, r_fp)); emit_insn (targetm.gen_nonlocal_goto (const0_rtx, r_label, r_sp, r_fp));
else else
#endif
{ {
r_label = copy_to_reg (r_label); r_label = copy_to_reg (r_label);
......
...@@ -959,16 +959,11 @@ emit_to_new_bb_before (rtx_insn *seq, rtx insn) ...@@ -959,16 +959,11 @@ emit_to_new_bb_before (rtx_insn *seq, rtx insn)
void void
expand_dw2_landing_pad_for_region (eh_region region) expand_dw2_landing_pad_for_region (eh_region region)
{ {
#ifdef HAVE_exception_receiver if (targetm.have_exception_receiver ())
if (HAVE_exception_receiver) emit_insn (targetm.gen_exception_receiver ());
emit_insn (gen_exception_receiver ()); else if (targetm.have_nonlocal_goto_receiver ())
emit_insn (targetm.gen_nonlocal_goto_receiver ());
else else
#endif
#ifdef HAVE_nonlocal_goto_receiver
if (HAVE_nonlocal_goto_receiver)
emit_insn (gen_nonlocal_goto_receiver ());
else
#endif
{ /* Nothing */ } { /* Nothing */ }
if (region->exc_ptr_reg) if (region->exc_ptr_reg)
......
...@@ -30,14 +30,20 @@ ...@@ -30,14 +30,20 @@
Patterns that take no operands should have a prototype "(void)". Patterns that take no operands should have a prototype "(void)".
Instructions should be documented in md.texi rather than here. */ Instructions should be documented in md.texi rather than here. */
DEF_TARGET_INSN (builtin_longjmp, (rtx x0))
DEF_TARGET_INSN (builtin_setjmp_receiver, (rtx x0))
DEF_TARGET_INSN (builtin_setjmp_setup, (rtx x0))
DEF_TARGET_INSN (canonicalize_funcptr_for_compare, (rtx x0, rtx x1)) DEF_TARGET_INSN (canonicalize_funcptr_for_compare, (rtx x0, rtx x1))
DEF_TARGET_INSN (casesi, (rtx x0, rtx x1, rtx x2, rtx x3, rtx x4)) DEF_TARGET_INSN (casesi, (rtx x0, rtx x1, rtx x2, rtx x3, rtx x4))
DEF_TARGET_INSN (epilogue, (void)) DEF_TARGET_INSN (epilogue, (void))
DEF_TARGET_INSN (exception_receiver, (void))
DEF_TARGET_INSN (jump, (rtx x0)) DEF_TARGET_INSN (jump, (rtx x0))
DEF_TARGET_INSN (load_multiple, (rtx x0, rtx x1, rtx x2)) DEF_TARGET_INSN (load_multiple, (rtx x0, rtx x1, rtx x2))
DEF_TARGET_INSN (mem_signal_fence, (rtx x0)) DEF_TARGET_INSN (mem_signal_fence, (rtx x0))
DEF_TARGET_INSN (mem_thread_fence, (rtx x0)) DEF_TARGET_INSN (mem_thread_fence, (rtx x0))
DEF_TARGET_INSN (memory_barrier, (void)) DEF_TARGET_INSN (memory_barrier, (void))
DEF_TARGET_INSN (nonlocal_goto, (rtx x0, rtx x1, rtx x2, rtx x3))
DEF_TARGET_INSN (nonlocal_goto_receiver, (void))
DEF_TARGET_INSN (prologue, (void)) DEF_TARGET_INSN (prologue, (void))
DEF_TARGET_INSN (return, (void)) DEF_TARGET_INSN (return, (void))
DEF_TARGET_INSN (sibcall_epilogue, (void)) DEF_TARGET_INSN (sibcall_epilogue, (void))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment