rs6000: New enum epilogue_type
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 14 May 2019 17:33:10 +0000 (19:33 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 14 May 2019 17:33:10 +0000 (19:33 +0200)
We currently call rs6000_emit_epilogue with a boolean parameter saying
if this is for a sibcall.  We also need to create epilogues for
eh_return.  This isn't yet indicated directly: instead, we get an
eh_return epilogue if crtl->calls_eh_return and this is not a sibcall.

This patch changes things so there is a three-way enum argument.

What is called "normal" now can still actually be "eh_return".  The
rs6000_emit_epilogue function still uses an "int sibcall" variable
internally.

* config/rs6000/rs6000-protos.h (rs6000_emit_epilogue): Change
arguments.
* config/rs6000/rs6000.c (rs6000_emit_epilogue): Change arguments.
* config/rs6000/rs6000.md (epilogue_type): New define_enum.
(sibcall_epilogue): Adjust.
(epilogue): Adjust.

From-SVN: r271184

gcc/ChangeLog
gcc/config/rs6000/rs6000-protos.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index bb597fa519eae5da5db566e2bbd12947541c34c5..812f8c34399f44718f262559f359f3687128d672 100644 (file)
@@ -1,3 +1,12 @@
+2019-05-14  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/rs6000/rs6000-protos.h (rs6000_emit_epilogue): Change
+       arguments.
+       * config/rs6000/rs6000.c (rs6000_emit_epilogue): Change arguments.
+       * config/rs6000/rs6000.md (epilogue_type): New define_enum.
+       (sibcall_epilogue): Adjust.
+       (epilogue): Adjust.
+
 2019-05-14  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * config.gcc: Move *-*-solaris2.10* from obsolete configurations
index 8466368ce4bf992bf188657cada501c4db01bb1e..9718adaa2b9d72b351ac35bf72e827d9aca4de96 100644 (file)
@@ -190,7 +190,7 @@ extern alias_set_type get_TOC_alias_set (void);
 extern void rs6000_emit_prologue (void);
 extern void rs6000_emit_load_toc_table (int);
 extern unsigned int rs6000_dbx_register_number (unsigned int, unsigned int);
-extern void rs6000_emit_epilogue (int);
+extern void rs6000_emit_epilogue (enum epilogue_type);
 extern void rs6000_expand_split_stack_prologue (void);
 extern void rs6000_split_stack_space_check (rtx, rtx);
 extern void rs6000_emit_eh_reg_restore (rtx, rtx);
index b886f58540492efdde2f10384b983fd2cba4a2a2..2992ba545d702766b9ec0d016f2b7bb01e163dd4 100644 (file)
@@ -27874,8 +27874,9 @@ emit_cfa_restores (rtx cfa_restores)
 /* Emit function epilogue as insns.  */
 
 void
-rs6000_emit_epilogue (int sibcall)
+rs6000_emit_epilogue (enum epilogue_type epilogue_type)
 {
+  int sibcall = (epilogue_type == EPILOGUE_TYPE_SIBCALL);
   rs6000_stack_t *info;
   int restoring_GPRs_inline;
   int restoring_FPRs_inline;
index 8da7aba408048ce5cc6ebe7c3754ea7830dd24a7..c3181e7f4dc9895bdb8f5a4934ea07ea2704d027 100644 (file)
    UNSPECV_SPEC_BARRIER         ; Speculation barrier
   ])
 
+; The three different kinds of epilogue.
+(define_enum "epilogue_type" [normal sibcall eh_return])
 \f
 ;; Define an insn type attribute.  This is used in function unit delay
 ;; computations.
 {
   if (!TARGET_SCHED_PROLOG)
     emit_insn (gen_blockage ());
-  rs6000_emit_epilogue (TRUE);
+  rs6000_emit_epilogue (EPILOGUE_TYPE_SIBCALL);
   DONE;
 })
 
 {
   if (!TARGET_SCHED_PROLOG)
     emit_insn (gen_blockage ());
-  rs6000_emit_epilogue (FALSE);
+  rs6000_emit_epilogue (EPILOGUE_TYPE_NORMAL);
   DONE;
 })