summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog18
-rw-r--r--gcc/alias.c20
-rw-r--r--gcc/calls.c9
-rw-r--r--gcc/cfgrtl.c2
-rw-r--r--gcc/defaults.h10
-rw-r--r--gcc/df-scan.c15
-rw-r--r--gcc/dwarf2cfi.c5
-rw-r--r--gcc/final.c12
-rw-r--r--gcc/function.c22
-rw-r--r--gcc/reorg.c2
-rw-r--r--gcc/target-insns.def5
-rw-r--r--gcc/toplev.c6
12 files changed, 53 insertions, 73 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6772150d8c3..18c02bdce44 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,21 @@
+2015-06-30 Richard Sandiford <richard.sandiford@arm.com>
+
+ * defaults.h (HAVE_epilogue, gen_epilogue): Delete.
+ * target-insns.def (epilogue, prologue, sibcall_prologue): New
+ targetm instruction patterns.
+ * alias.c (init_alias_analysis): Use them instead of HAVE_*/gen_*
+ interface.
+ * calls.c (expand_call): Likewise.
+ * cfgrtl.c (cfg_layout_finalize): Likewise.
+ * df-scan.c (df_get_entry_block_def_set): Likewise.
+ (df_get_exit_block_use_set): Likewise.
+ * dwarf2cfi.c (pass_dwarf2_frame::gate): Likewise.
+ * final.c (final_start_function): Likewise.
+ * function.c (thread_prologue_and_epilogue_insns): Likewise.
+ (reposition_prologue_and_epilogue_notes): Likewise.
+ * reorg.c (find_end_label): Likewise.
+ * toplev.c (process_options): Likewise.
+
2015-06-30 David Malcolm <dmalcolm@redhat.com>
* typed-splay-tree.h: New file.
diff --git a/gcc/alias.c b/gcc/alias.c
index ca2082e7e65..3e75b91b63d 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -3038,6 +3038,14 @@ init_alias_analysis (void)
rpo = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
rpo_cnt = pre_and_rev_post_order_compute (NULL, rpo, false);
+ /* The prologue/epilogue insns are not threaded onto the
+ insn chain until after reload has completed. Thus,
+ there is no sense wasting time checking if INSN is in
+ the prologue/epilogue until after reload has completed. */
+ bool could_be_prologue_epilogue = ((targetm.have_prologue ()
+ || targetm.have_epilogue ())
+ && reload_completed);
+
pass = 0;
do
{
@@ -3076,17 +3084,7 @@ init_alias_analysis (void)
{
rtx note, set;
-#if defined (HAVE_prologue)
- static const bool prologue = true;
-#else
- static const bool prologue = false;
-#endif
-
- /* The prologue/epilogue insns are not threaded onto the
- insn chain until after reload has completed. Thus,
- there is no sense wasting time checking if INSN is in
- the prologue/epilogue until after reload has completed. */
- if ((prologue || HAVE_epilogue) && reload_completed
+ if (could_be_prologue_epilogue
&& prologue_epilogue_contains (insn))
continue;
diff --git a/gcc/calls.c b/gcc/calls.c
index a8a1d0e5ac4..e97c356ca80 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -2783,13 +2783,8 @@ expand_call (tree exp, rtx target, int ignore)
try_tail_call = 0;
/* Rest of purposes for tail call optimizations to fail. */
- if (
-#ifdef HAVE_sibcall_epilogue
- !HAVE_sibcall_epilogue
-#else
- 1
-#endif
- || !try_tail_call
+ if (!try_tail_call
+ || !targetm.have_sibcall_epilogue ()
/* Doing sibling call optimization needs some work, since
structure_value_addr can be allocated on the stack.
It does not seem worth the effort since few optimizable
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 2e33dda2f81..5ac3a20d0b5 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -4324,7 +4324,7 @@ cfg_layout_finalize (void)
#endif
force_one_exit_fallthru ();
rtl_register_cfg_hooks ();
- if (reload_completed && !HAVE_epilogue)
+ if (reload_completed && !targetm.have_epilogue ())
fixup_fallthru_exit_predecessor ();
fixup_reorder_chain ();
diff --git a/gcc/defaults.h b/gcc/defaults.h
index 5534e42d8a0..95ec8f7c5cd 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -1426,16 +1426,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define TARGET_VTABLE_USES_DESCRIPTORS 0
#endif
-#ifndef HAVE_epilogue
-#define HAVE_epilogue 0
-static inline rtx
-gen_epilogue ()
-{
- gcc_unreachable ();
- return NULL;
-}
-#endif
-
#ifndef HAVE_mem_thread_fence
#define HAVE_mem_thread_fence 0
static inline rtx
diff --git a/gcc/df-scan.c b/gcc/df-scan.c
index 4e53f884443..22942407f26 100644
--- a/gcc/df-scan.c
+++ b/gcc/df-scan.c
@@ -52,13 +52,6 @@ along with GCC; see the file COPYING3. If not see
typedef struct df_mw_hardreg *df_mw_hardreg_ptr;
-#ifndef HAVE_prologue
-#define HAVE_prologue 0
-#endif
-#ifndef HAVE_sibcall_epilogue
-#define HAVE_sibcall_epilogue 0
-#endif
-
/* The set of hard registers in eliminables[i].from. */
static HARD_REG_SET elim_reg_set;
@@ -3523,7 +3516,7 @@ df_get_entry_block_def_set (bitmap entry_block_defs)
/* Once the prologue has been generated, all of these registers
should just show up in the first regular block. */
- if (HAVE_prologue && epilogue_completed)
+ if (targetm.have_prologue () && epilogue_completed)
{
/* Defs for the callee saved registers are inserted so that the
pushes have some defining location. */
@@ -3701,7 +3694,7 @@ df_get_exit_block_use_set (bitmap exit_block_uses)
if (global_regs[i] || EPILOGUE_USES (i))
bitmap_set_bit (exit_block_uses, i);
- if (HAVE_epilogue && epilogue_completed)
+ if (targetm.have_epilogue () && epilogue_completed)
{
/* Mark all call-saved registers that we actually used. */
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
@@ -3721,7 +3714,7 @@ df_get_exit_block_use_set (bitmap exit_block_uses)
}
#ifdef EH_RETURN_STACKADJ_RTX
- if ((!HAVE_epilogue || ! epilogue_completed)
+ if ((!targetm.have_epilogue () || ! epilogue_completed)
&& crtl->calls_eh_return)
{
rtx tmp = EH_RETURN_STACKADJ_RTX;
@@ -3731,7 +3724,7 @@ df_get_exit_block_use_set (bitmap exit_block_uses)
#endif
#ifdef EH_RETURN_HANDLER_RTX
- if ((!HAVE_epilogue || ! epilogue_completed)
+ if ((!targetm.have_epilogue () || ! epilogue_completed)
&& crtl->calls_eh_return)
{
rtx tmp = EH_RETURN_HANDLER_RTX;
diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c
index e7117fffcc1..b567b23f938 100644
--- a/gcc/dwarf2cfi.c
+++ b/gcc/dwarf2cfi.c
@@ -3476,11 +3476,10 @@ public:
bool
pass_dwarf2_frame::gate (function *)
{
-#ifndef HAVE_prologue
/* Targets which still implement the prologue in assembler text
cannot use the generic dwarf2 unwinding. */
- return false;
-#endif
+ if (!targetm.have_prologue ())
+ return false;
/* ??? What to do for UI_TARGET unwinding? They might be able to benefit
from the optimized shrink-wrapping annotations that we will compute.
diff --git a/gcc/final.c b/gcc/final.c
index a4b0f36c624..fe2d6adb3ba 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -1803,12 +1803,8 @@ final_start_function (rtx_insn *first, FILE *file,
if the profiling code comes after the prologue. */
if (targetm.profile_before_prologue () && crtl->profile)
{
- if (targetm.asm_out.function_prologue
- == default_function_pro_epilogue
-#ifdef HAVE_prologue
- && HAVE_prologue
-#endif
- )
+ if (targetm.asm_out.function_prologue == default_function_pro_epilogue
+ && targetm.have_prologue ())
{
rtx_insn *insn;
for (insn = first; insn; insn = NEXT_INSN (insn))
@@ -1864,9 +1860,7 @@ final_start_function (rtx_insn *first, FILE *file,
/* If the machine represents the prologue as RTL, the profiling code must
be emitted when NOTE_INSN_PROLOGUE_END is scanned. */
-#ifdef HAVE_prologue
- if (! HAVE_prologue)
-#endif
+ if (! targetm.have_prologue ())
profile_after_prologue (file);
}
diff --git a/gcc/function.c b/gcc/function.c
index de0b38fe52a..8134c4e7067 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -5864,11 +5864,10 @@ thread_prologue_and_epilogue_insns (void)
}
prologue_seq = NULL;
-#ifdef HAVE_prologue
- if (HAVE_prologue)
+ if (targetm.have_prologue ())
{
start_sequence ();
- rtx_insn *seq = safe_as_a <rtx_insn *> (gen_prologue ());
+ rtx_insn *seq = targetm.gen_prologue ();
emit_insn (seq);
/* Insert an explicit USE for the frame pointer
@@ -5890,7 +5889,6 @@ thread_prologue_and_epilogue_insns (void)
end_sequence ();
set_insn_locations (prologue_seq, prologue_location);
}
-#endif
bitmap_initialize (&bb_flags, &bitmap_default_obstack);
@@ -5995,11 +5993,11 @@ thread_prologue_and_epilogue_insns (void)
if (exit_fallthru_edge == NULL)
goto epilogue_done;
- if (HAVE_epilogue)
+ if (targetm.have_epilogue ())
{
start_sequence ();
epilogue_end = emit_note (NOTE_INSN_EPILOGUE_BEG);
- rtx_insn *seq = as_a <rtx_insn *> (gen_epilogue ());
+ rtx_insn *seq = targetm.gen_epilogue ();
if (seq)
emit_jump_insn (seq);
@@ -6070,7 +6068,6 @@ epilogue_done:
convert_to_simple_return (entry_edge, orig_entry_edge, bb_flags,
returnjump, unconverted_simple_returns);
-#ifdef HAVE_sibcall_epilogue
/* Emit sibling epilogues before any sibling call sites. */
for (ei = ei_start (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds); (e =
ei_safe_edge (ei));
@@ -6078,7 +6075,6 @@ epilogue_done:
{
basic_block bb = e->src;
rtx_insn *insn = BB_END (bb);
- rtx ep_seq;
if (!CALL_P (insn)
|| ! SIBLING_CALL_P (insn)
@@ -6090,8 +6086,7 @@ epilogue_done:
continue;
}
- ep_seq = gen_sibcall_epilogue ();
- if (ep_seq)
+ if (rtx_insn *ep_seq = targetm.gen_sibcall_epilogue ())
{
start_sequence ();
emit_note (NOTE_INSN_EPILOGUE_BEG);
@@ -6109,7 +6104,6 @@ epilogue_done:
}
ei_next (&ei);
}
-#endif
if (epilogue_end)
{
@@ -6143,10 +6137,10 @@ epilogue_done:
void
reposition_prologue_and_epilogue_notes (void)
{
-#if ! defined (HAVE_prologue) && ! defined (HAVE_sibcall_epilogue)
- if (!HAVE_epilogue)
+ if (!targetm.have_prologue ()
+ && !targetm.have_epilogue ()
+ && !targetm.have_sibcall_epilogue ())
return;
-#endif
/* Since the hash table is created on demand, the fact that it is
non-null is a signal that it is non-empty. */
diff --git a/gcc/reorg.c b/gcc/reorg.c
index b24a3f04388..6de8a544df5 100644
--- a/gcc/reorg.c
+++ b/gcc/reorg.c
@@ -473,7 +473,7 @@ find_end_label (rtx kind)
}
else
{
- if (HAVE_epilogue && ! targetm.have_return ())
+ if (targetm.have_epilogue () && ! targetm.have_return ())
/* The RETURN insn has its delay slot filled so we cannot
emit the label just before it. Since we already have
an epilogue and cannot emit a new RETURN, we cannot
diff --git a/gcc/target-insns.def b/gcc/target-insns.def
index d8ca63f5d4b..8fa81ded852 100644
--- a/gcc/target-insns.def
+++ b/gcc/target-insns.def
@@ -30,6 +30,9 @@
Patterns that take no operands should have a prototype "(void)".
Instructions should be documented in md.texi rather than here. */
+DEF_TARGET_INSN (canonicalize_funcptr_for_compare, (rtx x0, rtx x1))
+DEF_TARGET_INSN (epilogue, (void))
+DEF_TARGET_INSN (prologue, (void))
DEF_TARGET_INSN (return, (void))
+DEF_TARGET_INSN (sibcall_epilogue, (void))
DEF_TARGET_INSN (simple_return, (void))
-DEF_TARGET_INSN (canonicalize_funcptr_for_compare, (rtx x0, rtx x1))
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 573b144a138..1fc5bd92d83 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -112,10 +112,6 @@ along with GCC; see the file COPYING3. If not see
declarations for e.g. AIX 4.x. */
#endif
-#ifndef HAVE_prologue
-#define HAVE_prologue 0
-#endif
-
#include <new>
static void general_init (const char *, bool);
@@ -1660,7 +1656,7 @@ process_options (void)
/* Do not use IPA optimizations for register allocation if profiler is active
or port does not emit prologue and epilogue as RTL. */
- if (profile_flag || !HAVE_prologue || !HAVE_epilogue)
+ if (profile_flag || !targetm.have_prologue () || !targetm.have_epilogue ())
flag_ipa_ra = 0;
/* Enable -Werror=coverage-mismatch when -Werror and -Wno-error