defaults.h (HAVE_epilogue, [...]): Delete.
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 30 Jun 2015 20:55:13 +0000 (20:55 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 30 Jun 2015 20:55:13 +0000 (20:55 +0000)
gcc/
* 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.

From-SVN: r225208

12 files changed:
gcc/ChangeLog
gcc/alias.c
gcc/calls.c
gcc/cfgrtl.c
gcc/defaults.h
gcc/df-scan.c
gcc/dwarf2cfi.c
gcc/final.c
gcc/function.c
gcc/reorg.c
gcc/target-insns.def
gcc/toplev.c

index 6772150d8c31b099eb69ad97ebbceef8df87d8c0..18c02bdce449db74189aa0dba871970d76526fcb 100644 (file)
@@ -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.
index ca2082e7e65f6ff3b78423349c98fe5dc7545e17..3e75b91b63d15b0bdb009520ebee55e0bae06b41 100644 (file)
@@ -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;
 
index a8a1d0e5ac4f1aa8701c906d6a2159a44f546dd9..e97c356ca8061c4593c56453c575277a6607b012 100644 (file)
@@ -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
index 2e33dda2f81581062ad411a7234e54e5e4110dfe..5ac3a20d0b5df9e91732f919b1d1d68d542c75a9 100644 (file)
@@ -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 ();
 
index 5534e42d8a0ba6fda73c5a063927c059b5984969..95ec8f7c5cd6b830449fca09679f3b595c44fbe6 100644 (file)
@@ -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
index 4e53f8844436d7c76155fedd8dc99ad55f9fa727..22942407f260b1e097afac1177386921c0215954 100644 (file)
@@ -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;
index e7117fffcc130b44ed4d5b7e953b2248eb9abe1a..b567b23f93853dd4275b46bb8f41027c373b5c67 100644 (file)
@@ -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.
index a4b0f36c62469aee1c0e662ab4ec6ddf86a8892b..fe2d6adb3badc739227e4cc5c53bc45c2393d042 100644 (file)
@@ -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);
 }
 
index de0b38fe52af23da6a74d8d0e6a8e342b4b2e274..8134c4e7067d6c356a11340d90cb5c0fa7a75d9a 100644 (file)
@@ -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.  */
index b24a3f04388398b7b8c15d6acb2df84114a53e8c..6de8a544df55971c37ddbd49b1c012b3e9716e11 100644 (file)
@@ -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
index d8ca63f5d4bf616657688fe22d6b75e1019400a5..8fa81ded8520970f87c50364e85d6bdc4c6b8916 100644 (file)
@@ -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))
index 573b144a138735fc9684612222be58915ad6a554..1fc5bd92d83a582c8b9b0282ced74318892b5717 100644 (file)
@@ -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