From 8763a6a9e072bd0fe01caab0fa511afe9e30e7d8 Mon Sep 17 00:00:00 2001 From: aesok Date: Sun, 2 May 2010 10:49:10 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158970 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 22 ++++++++++++++++++++++ gcc/Makefile.in | 2 +- gcc/builtins.c | 2 +- gcc/config/i386/i386.c | 8 ++++++-- gcc/doc/tm.texi | 18 ++++++++++++++++++ gcc/target-def.h | 2 ++ gcc/target.h | 4 ++++ 7 files changed, 54 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7f636b3c908..d0122024500 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,25 @@ +2010-05-01 Anatoly Sokolov + + * 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. + 2010-05-01 Richard Guenther PR tree-optimization/43949 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 48f2c618ea5..95185da5354 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2991,7 +2991,7 @@ lcm.o : lcm.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \ 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) \ diff --git a/gcc/builtins.c b/gcc/builtins.c index b514ae03b41..5f4b7176155 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1322,7 +1322,7 @@ apply_result_size (void) 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]; diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 63545c807c8..61a619bed2a 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -1880,6 +1880,7 @@ static bool ext_80387_constants_init = 0; 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 *); @@ -6331,8 +6332,8 @@ ix86_function_arg_boundary (enum machine_mode mode, tree type) /* 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) { @@ -30656,6 +30657,9 @@ ix86_enum_va_list (int idx, const char **pname, tree *ptree) #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 diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 6582ab1cd91..a20d48c9f9c 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -4461,8 +4461,26 @@ suffices: If the machine has register windows, so that the caller and the called function use different registers for the return value, this macro should recognize only the caller's register numbers. + +This macro has been deprecated. Use @code{TARGET_FUNCTION_VALUE_REGNO_P} +for a new target instead. @end defmac +@deftypefn {Target Hook} bool TARGET_FUNCTION_VALUE_REGNO_P (const unsigned int @var{regno}) +A target hook that return @code{true} if @var{regno} is the number of a hard +register in which the values of called function may come back. + +A register whose use for returning values is limited to serving as the +second of a pair (for a value of type @code{double}, say) need not be +recognized by this target hook. + +If the machine has register windows, so that the caller and the called +function use different registers for the return value, this target hook +should recognize only the caller's register numbers. + +If this hook is not defined, then FUNCTION_VALUE_REGNO_P will be used. +@end deftypefn + @defmac TARGET_ENUM_VA_LIST (@var{idx}, @var{pname}, @var{ptype}) This target macro is used in function @code{c_common_nodes_and_builtins} to iterate through the target specific builtin types for va_list. The diff --git a/gcc/target-def.h b/gcc/target-def.h index d0566650cf7..feca6c5270c 100644 --- a/gcc/target-def.h +++ b/gcc/target-def.h @@ -661,6 +661,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 @@ -687,6 +688,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, \ diff --git a/gcc/target.h b/gcc/target.h index 7729525512d..62a1bcc3d7e 100644 --- a/gcc/target.h +++ b/gcc/target.h @@ -968,6 +968,10 @@ struct gcc_target 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); -- 2.11.0