This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Hookize TARGET_FUNCTION_VALUE_REGNO_P


Hello.

This patch turns TARGET_FUNCTION_VALUE_REGNO_P macro into a hook.

The patch has been bootstrapped on and regression tested on:
x86_64-unknown-linux-gnu

Ok for mainline?


        * target.h (struct calls): Add function_value_regno_p field.
        * target-def.h (TARGET_FUNCTION_VALUE_REGNO_P): Define.
        (TARGET_INITIALIZER): Use TARGET_FUNCTION_VALUE_REGNO_P.
        * targhooks.c (default_function_value_regno_p): New function.
        * targhooks.h (default_function_value_regno_p): Declare function.
        * rtlanal.c (keep_with_call_p): Use function_value_regno_p hook.
        * builtins.c. (apply_result_size): (Ditto.).
        * combine.c. (likely_spilled_retval_p): (Ditto.).
        * mode-switching.c. Include 'target.h'.
        (create_pre_exit): Use function_value_regno_p hook.
        * Makefile.in (mode-switching.o): Add dependency on TARGET_H.
        * doc/tm.texi (FUNCTION_VALUE_REGNO_P, TARGET_FUNCTION_VALUE_REGNO_P):
        Revise documentation.

        * config/i386/i386.h (TARGET_FUNCTION_VALUE_REGNO_P): Remove macro.
        * config/i386/i386.c (TARGET_FUNCTION_VALUE_REGNO_P): Define macro.
        (ix86_function_value_regno_p): Declare as static, change argument
        type to const unsigned int.
        * config/i386/i386-protos.h (ix86_function_value_regno_p): Remove


Index: gcc/targhooks.c
===================================================================
--- gcc/targhooks.c     (revision 154129)
+++ gcc/targhooks.c     (working copy)
@@ -618,6 +618,18 @@
 #endif
 }
 
+/* The default hook for TARGET_FUNCTION_VALUE_REGNO_P.  */
+
+bool
+default_function_value_regno_p (const unsigned int regno ATTRIBUTE_UNUSED)
+{
+#ifdef FUNCTION_VALUE_REGNO_P
+  return FUNCTION_VALUE_REGNO_P (regno);
+#else
+  gcc_unreachable ();
+#endif
+}
+
 rtx
 default_internal_arg_pointer (void)
 {
Index: gcc/targhooks.h
===================================================================
--- gcc/targhooks.h     (revision 154129)
+++ gcc/targhooks.h     (working copy)
@@ -99,6 +99,7 @@
 extern bool hook_bool_const_rtx_commutative_p (const_rtx, int);
 extern rtx default_function_value (const_tree, const_tree, bool);
 extern rtx default_libcall_value (enum machine_mode, const_rtx);
+extern bool default_function_value_regno_p (const unsigned int);
 extern rtx default_internal_arg_pointer (void);
 extern rtx default_static_chain (const_tree, bool);
 extern void default_trampoline_init (rtx, tree, rtx);
Index: gcc/target.h
===================================================================
--- gcc/target.h        (revision 154129)
+++ gcc/target.h        (working copy)
@@ -954,6 +954,10 @@
        calling the function FN_NAME.  */
     rtx (*libcall_value) (enum machine_mode, const_rtx);
 
+    /* Return true if REGNO is a possible register number for
+       a function value as seen by the caller.  */
+    bool (*function_value_regno_p) (const unsigned int);
+
     /* Return an rtx for the argument pointer incoming to the
        current function.  */
     rtx (*internal_arg_pointer) (void);
Index: gcc/rtlanal.c
===================================================================
--- gcc/rtlanal.c       (revision 154129)
+++ gcc/rtlanal.c       (working copy)
@@ -3474,7 +3474,7 @@
          && general_operand (SET_SRC (set), VOIDmode))
        return true;
       if (REG_P (SET_SRC (set))
-         && FUNCTION_VALUE_REGNO_P (REGNO (SET_SRC (set)))
+         && targetm.calls.function_value_regno_p (REGNO (SET_SRC (set)))
          && REG_P (SET_DEST (set))
          && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
        return true;
Index: gcc/builtins.c
===================================================================
--- gcc/builtins.c      (revision 154129)
+++ gcc/builtins.c      (working copy)
@@ -1318,7 +1318,7 @@
       size = 0;
 
       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
-       if (FUNCTION_VALUE_REGNO_P (regno))
+       if (targetm.calls.function_value_regno_p (regno))
          {
            mode = reg_raw_mode[regno];
 
Index: gcc/mode-switching.c
===================================================================
--- gcc/mode-switching.c        (revision 154129)
+++ gcc/mode-switching.c        (working copy)
@@ -22,6 +22,7 @@
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
+#include "target.h"
 #include "rtl.h"
 #include "regs.h"
 #include "hard-reg-set.h"
@@ -262,7 +263,7 @@
                      case USE:
                        /* Skip __builtin_apply pattern.  */
                        if (GET_CODE (XEXP (return_copy_pat, 0)) == REG
-                           && (FUNCTION_VALUE_REGNO_P
+                           && (targetm.calls.function_value_regno_p
                                (REGNO (XEXP (return_copy_pat, 0)))))
                          {
                            maybe_builtin_apply = 1;
@@ -359,7 +360,8 @@
                        && copy_start + copy_num <= ret_end)
                      nregs -= copy_num;
                    else if (!maybe_builtin_apply
-                            || !FUNCTION_VALUE_REGNO_P (copy_start))
+                            || !targetm.calls.function_value_regno_p
+                                (copy_start))
                      break;
                    last_insn = return_copy;
                  }
Index: gcc/target-def.h
===================================================================
--- gcc/target-def.h    (revision 154129)
+++ gcc/target-def.h    (working copy)
@@ -652,6 +652,7 @@
 
 #define TARGET_FUNCTION_VALUE default_function_value
 #define TARGET_LIBCALL_VALUE default_libcall_value
+#define TARGET_FUNCTION_VALUE_REGNO_P default_function_value_regno_p
 #define TARGET_INTERNAL_ARG_POINTER default_internal_arg_pointer
 #define TARGET_UPDATE_STACK_BOUNDARY NULL
 #define TARGET_GET_DRAP_RTX NULL
@@ -678,6 +679,7 @@
    TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN,                     \
    TARGET_FUNCTION_VALUE,                                      \
    TARGET_LIBCALL_VALUE,                                       \
+   TARGET_FUNCTION_VALUE_REGNO_P,                              \
    TARGET_INTERNAL_ARG_POINTER,                                        \
    TARGET_UPDATE_STACK_BOUNDARY,                               \
    TARGET_GET_DRAP_RTX,                                                \
Index: gcc/combine.c
===================================================================
--- gcc/combine.c       (revision 154129)
+++ gcc/combine.c       (working copy)
@@ -2068,14 +2068,14 @@
   unsigned regno, nregs;
   /* We assume here that no machine mode needs more than
      32 hard registers when the value overlaps with a register
-     for which FUNCTION_VALUE_REGNO_P is true.  */
+     for which TARGET_FUNCTION_VALUE_REGNO_P is true.  */
   unsigned mask;
   struct likely_spilled_retval_info info;
 
   if (!NONJUMP_INSN_P (use) || GET_CODE (PATTERN (use)) != USE || insn == use)
     return 0;
   reg = XEXP (PATTERN (use), 0);
-  if (!REG_P (reg) || !FUNCTION_VALUE_REGNO_P (REGNO (reg)))
+  if (!REG_P (reg) || !targetm.calls.function_value_regno_p (REGNO (reg)))
     return 0;
   regno = REGNO (reg);
   nregs = hard_regno_nregs[regno][GET_MODE (reg)];
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in     (revision 154129)
+++ gcc/Makefile.in     (working copy)
@@ -2958,7 +2958,7 @@
 mode-switching.o : mode-switching.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
    $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h $(FLAGS_H) insn-config.h \
    $(INSN_ATTR_H) $(RECOG_H) $(BASIC_BLOCK_H) $(TM_P_H) $(FUNCTION_H) \
-   output.h $(TREE_PASS_H) $(TIMEVAR_H) $(REAL_H) $(DF_H)
+   output.h $(TREE_PASS_H) $(TIMEVAR_H) $(REAL_H) $(DF_H) $(TARGET_H)
 tree-ssa-dce.o : tree-ssa-dce.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
     $(RTL_H) $(TM_P_H) $(TREE_FLOW_H) $(DIAGNOSTIC_H) $(TIMEVAR_H) $(TM_H) \
     coretypes.h $(TREE_DUMP_H) $(TREE_PASS_H) $(FLAGS_H) $(BASIC_BLOCK_H) \
Index: gcc/config/i386/i386.h
===================================================================
--- gcc/config/i386/i386.h      (revision 154129)
+++ gcc/config/i386/i386.h      (working copy)
@@ -1557,8 +1557,6 @@
 #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) \
   ix86_return_pops_args ((FUNDECL), (FUNTYPE), (SIZE))
 
-#define FUNCTION_VALUE_REGNO_P(N) ix86_function_value_regno_p (N)
-
 /* Define how to find the value returned by a library function
    assuming the value has mode MODE.  */
 
Index: gcc/config/i386/i386-protos.h
===================================================================
--- gcc/config/i386/i386-protos.h       (revision 154129)
+++ gcc/config/i386/i386-protos.h       (working copy)
@@ -132,7 +132,6 @@
 extern enum machine_mode ix86_fp_compare_mode (enum rtx_code);
 
 extern rtx ix86_libcall_value (enum machine_mode);
-extern bool ix86_function_value_regno_p (int);
 extern bool ix86_function_arg_regno_p (int);
 extern int ix86_function_arg_boundary (enum machine_mode, tree);
 extern bool ix86_sol10_return_in_memory (const_tree,const_tree);
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c      (revision 154129)
+++ gcc/config/i386/i386.c      (working copy)
@@ -1884,6 +1884,7 @@
 
 static struct machine_function * ix86_init_machine_status (void);
 static rtx ix86_function_value (const_tree, const_tree, bool);
+static bool ix86_function_value_regno_p (const unsigned int);
 static rtx ix86_static_chain (const_tree, bool);
 static int ix86_function_regparm (const_tree, const_tree);
 static void ix86_compute_frame_layout (struct ix86_frame *);
@@ -6279,8 +6280,8 @@
 
 /* Return true if N is a possible register number of function value.  */
 
-bool
-ix86_function_value_regno_p (int regno)
+static bool
+ix86_function_value_regno_p (const unsigned int regno)
 {
   switch (regno)
     {
@@ -30751,6 +30752,9 @@
 #undef TARGET_FUNCTION_VALUE
 #define TARGET_FUNCTION_VALUE ix86_function_value
 
+#undef TARGET_FUNCTION_VALUE_REGNO_P
+#define TARGET_FUNCTION_VALUE_REGNO_P ix86_function_value_regno_p
+
 #undef TARGET_SECONDARY_RELOAD
 #define TARGET_SECONDARY_RELOAD ix86_secondary_reload
 

Anatoly.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]