diff options
-rw-r--r-- | gcc/ChangeLog | 18 | ||||
-rw-r--r-- | gcc/alias.c | 20 | ||||
-rw-r--r-- | gcc/calls.c | 9 | ||||
-rw-r--r-- | gcc/cfgrtl.c | 2 | ||||
-rw-r--r-- | gcc/defaults.h | 10 | ||||
-rw-r--r-- | gcc/df-scan.c | 15 | ||||
-rw-r--r-- | gcc/dwarf2cfi.c | 5 | ||||
-rw-r--r-- | gcc/final.c | 12 | ||||
-rw-r--r-- | gcc/function.c | 22 | ||||
-rw-r--r-- | gcc/reorg.c | 2 | ||||
-rw-r--r-- | gcc/target-insns.def | 5 | ||||
-rw-r--r-- | gcc/toplev.c | 6 |
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 |