From patchwork Thu Jun 10 17:41:57 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Anatoly Sokolov X-Patchwork-Id: 55240 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 4A1E71007D1 for ; Fri, 11 Jun 2010 03:41:40 +1000 (EST) Received: (qmail 20358 invoked by alias); 10 Jun 2010 17:41:37 -0000 Received: (qmail 20349 invoked by uid 22791); 10 Jun 2010 17:41:35 -0000 X-SWARE-Spam-Status: No, hits=2.6 required=5.0 tests=AWL, BAYES_20, KAM_THEBAT, RCVD_IN_DNSWL_NONE, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from contrabass.post.ru (HELO contrabass.post.ru) (85.21.78.5) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 10 Jun 2010 17:41:30 +0000 Received: from corbina.ru (mail.post.ru [195.14.50.16]) by contrabass.post.ru (Postfix) with ESMTP id 0B5A9AF290; Thu, 10 Jun 2010 21:41:27 +0400 (MSD) Received: from [89.178.246.61] (account aesok@post.ru HELO Vista.corbina.ru) by corbina.ru (CommuniGate Pro SMTP 5.1.14) with ESMTPA id 219979021; Thu, 10 Jun 2010 21:41:26 +0400 Date: Thu, 10 Jun 2010 21:41:57 +0400 From: Anatoly Sokolov Message-ID: <1154868698.20100610214157@post.ru> To: gcc-patches@gcc.gnu.org CC: wilson@codesourcery.com, sje@cup.hp.com Subject: [IA64] Hookize FUNCTION_VALUE, LIBCALL_VALUE and FUNCTION_VALUE_REGNO_P MIME-Version: 1.0 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hello. This patch removes obsolete FUNCTION_VALUE, LIBCALL_VALUE and FUNCTION_VALUE_REGNO_P macros from IA64 back end in the GCC and introduces equivalent TARGET_FUNCTION_VALUE, TARGET_LIBCALL_VALUE and TARGET_FUNCTION_VALUE_REGNO_P target hooks.  Bootstrapped and regression tested on ia64-unknown-linux-gnu. OK to install? * config/ia64/ia64.h (FUNCTION_VALUE_REGNO_P, FUNCTION_VALUE, LIBCALL_VALUE): Remove macros. * config/ia64/ia64-protos.h (ia64_function_value): Remove. * config/ia64/ia64.c (TARGET_FUNCTION_VALUE, TARGET_LIBCALL_VALUE, TARGET_FUNCTION_VALUE_REGNO_P): Define. (ia64_libcall_value, ia64_function_value_regno_p): New functions. (ia64_function_value): Make static. Handle receiving the function type in 'fn_decl_or_type' argunent. Add 'outgoing' argument. Anatoly. Index: gcc/config/ia64/ia64.c =================================================================== --- gcc/config/ia64/ia64.c (revision 160437) +++ gcc/config/ia64/ia64.c (working copy) @@ -207,6 +207,9 @@ tree, bool); static bool ia64_function_ok_for_sibcall (tree, tree); static bool ia64_return_in_memory (const_tree, const_tree); +static rtx ia64_function_value (const_tree, const_tree, bool); +static rtx ia64_libcall_value (enum machine_mode, const_rtx); +static bool ia64_function_value_regno_p (const unsigned int); static bool ia64_rtx_costs (rtx, int, int, int *, bool); static int ia64_unspec_may_trap_p (const_rtx, unsigned); static void fix_range (const char *); @@ -482,6 +485,13 @@ #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true #endif +#undef TARGET_FUNCTION_VALUE +#define TARGET_FUNCTION_VALUE ia64_function_value +#undef TARGET_LIBCALL_VALUE +#define TARGET_LIBCALL_VALUE ia64_libcall_value +#undef TARGET_FUNCTION_VALUE_REGNO_P +#define TARGET_FUNCTION_VALUE_REGNO_P ia64_function_value_regno_p + #undef TARGET_STRUCT_VALUE_RTX #define TARGET_STRUCT_VALUE_RTX ia64_struct_value_rtx #undef TARGET_RETURN_IN_MEMORY @@ -4637,13 +4647,20 @@ /* Return rtx for register that holds the function return value. */ -rtx -ia64_function_value (const_tree valtype, const_tree func) +static rtx +ia64_function_value (const_tree valtype, + const_tree fn_decl_or_type, + bool outgoing ATTRIBUTE_UNUSED) { enum machine_mode mode; enum machine_mode hfa_mode; int unsignedp; + const_tree func = fn_decl_or_type; + if (fn_decl_or_type + && !DECL_P (fn_decl_or_type)) + func = NULL; + mode = TYPE_MODE (valtype); hfa_mode = hfa_element_mode (valtype, 0); @@ -4721,6 +4738,28 @@ } } +/* Worker function for TARGET_LIBCALL_VALUE. */ + +static rtx +ia64_libcall_value (enum machine_mode mode, + const_rtx fun ATTRIBUTE_UNUSED) +{ + return gen_rtx_REG (mode, + (((GET_MODE_CLASS (mode) == MODE_FLOAT + || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT) + && (mode) != TFmode) + ? FR_RET_FIRST : GR_RET_FIRST)); +} + +/* Worker function for FUNCTION_VALUE_REGNO_P. */ + +static bool +ia64_function_value_regno_p (const unsigned int regno) +{ + return ((regno >= GR_RET_FIRST && regno <= GR_RET_LAST) + || (regno >= FR_RET_FIRST && regno <= FR_RET_LAST)); +} + /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL. We need to emit DTP-relative relocations. */ Index: gcc/config/ia64/ia64.h =================================================================== --- gcc/config/ia64/ia64.h (revision 160437) +++ gcc/config/ia64/ia64.h (working copy) @@ -1146,32 +1146,7 @@ #define FUNCTION_ARG_REGNO_P(REGNO) \ (((REGNO) >= AR_ARG_FIRST && (REGNO) < (AR_ARG_FIRST + MAX_ARGUMENT_SLOTS)) \ || ((REGNO) >= FR_ARG_FIRST && (REGNO) < (FR_ARG_FIRST + MAX_ARGUMENT_SLOTS))) - -/* How Scalar Function Values are Returned */ -/* A C expression to create an RTX representing the place where a function - returns a value of data type VALTYPE. */ - -#define FUNCTION_VALUE(VALTYPE, FUNC) \ - ia64_function_value (VALTYPE, FUNC) - -/* A C expression to create an RTX representing the place where a library - function returns a value of mode MODE. */ - -#define LIBCALL_VALUE(MODE) \ - gen_rtx_REG (MODE, \ - (((GET_MODE_CLASS (MODE) == MODE_FLOAT \ - || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT) && \ - (MODE) != TFmode) \ - ? FR_RET_FIRST : GR_RET_FIRST)) - -/* A C expression that is nonzero if REGNO is the number of a hard register in - which the values of called function may come back. */ - -#define FUNCTION_VALUE_REGNO_P(REGNO) \ - (((REGNO) >= GR_RET_FIRST && (REGNO) <= GR_RET_LAST) \ - || ((REGNO) >= FR_RET_FIRST && (REGNO) <= FR_RET_LAST)) - /* How Large Values are Returned */ Index: gcc/config/ia64/ia64-protos.h =================================================================== --- gcc/config/ia64/ia64-protos.h (revision 160437) +++ gcc/config/ia64/ia64-protos.h (working copy) @@ -69,7 +69,6 @@ tree, int, int); extern rtx ia64_expand_builtin (tree, rtx, rtx, enum machine_mode, int); extern rtx ia64_va_arg (tree, tree); -extern rtx ia64_function_value (const_tree, const_tree); #endif /* RTX_CODE */ extern void ia64_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,