From patchwork Fri Aug 27 00:33:37 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Froyd X-Patchwork-Id: 62816 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 43107B70D9 for ; Fri, 27 Aug 2010 10:33:49 +1000 (EST) Received: (qmail 27288 invoked by alias); 27 Aug 2010 00:33:46 -0000 Received: (qmail 27272 invoked by uid 22791); 27 Aug 2010 00:33:44 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL, BAYES_00, TW_FN, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 27 Aug 2010 00:33:39 +0000 Received: (qmail 31792 invoked from network); 27 Aug 2010 00:33:38 -0000 Received: from unknown (HELO localhost) (froydnj@127.0.0.2) by mail.codesourcery.com with ESMTPA; 27 Aug 2010 00:33:38 -0000 Date: Thu, 26 Aug 2010 17:33:37 -0700 From: Nathan Froyd To: gcc-patches@gcc.gnu.org Cc: kkojima@gcc.gnu.org Subject: [sh] hookize FUNCTION_ARG &co. Message-ID: <20100827003337.GM16898@codesourcery.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.17+20080114 (2008-01-14) 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 This patch hookizes FUNCTION_ARG and related macros for the sh backend. It is straightforward, though there's a bit of twiddling for const correctness, in particular the PASS_IN_REG_P change. Tested on sh-elf. I plan to commit this under the obvious rule in a week after waiting for comments. -Nathan * config/sh/sh-protos.h (sh_function_arg): Delete. (sh_function_arg_advance): Delete. * config/sh/sh.h (FUNCTION_ARG, FUNCTION_ARG_ADVANCE): Delete. (PASS_IN_REG_P): Eliminate cast. * config/sh/sh.c (sh_function_arg_advance): Make static. Take a const_tree and a bool. (sh_function_arg): Likewise. (sh_output_mi_thunk): Call sh_function_arg_advance) and sh_function_arg. (TARGET_FUNCTION_ARG, TARGET_FUNCTION_ARG_ADVANCE): Define. diff --git a/gcc/config/sh/sh-protos.h b/gcc/config/sh/sh-protos.h index dc68af1..7a52ade 100644 --- a/gcc/config/sh/sh-protos.h +++ b/gcc/config/sh/sh-protos.h @@ -159,8 +159,6 @@ extern void sh_pr_nosave_low_regs (struct cpp_reader *); extern rtx function_symbol (rtx, const char *, enum sh_function_kind); extern rtx sh_get_pr_initial_val (void); -extern rtx sh_function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int); -extern void sh_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree, int); extern int sh_pass_in_reg_p (CUMULATIVE_ARGS *, enum machine_mode, tree); extern void sh_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, signed int, enum machine_mode); extern bool sh_function_value_regno_p (const unsigned int); diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 8ace99c..2fff0e1 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -282,6 +282,10 @@ static bool sh_callee_copies (CUMULATIVE_ARGS *, enum machine_mode, const_tree, bool); static int sh_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode, tree, bool); +static void sh_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, + const_tree, bool); +static rtx sh_function_arg (CUMULATIVE_ARGS *, enum machine_mode, + const_tree, bool); static bool sh_scalar_mode_supported_p (enum machine_mode); static int sh_dwarf_calling_convention (const_tree); static void sh_encode_section_info (tree, rtx, int); @@ -495,6 +499,10 @@ static const struct attribute_spec sh_attribute_table[] = #define TARGET_CALLEE_COPIES sh_callee_copies #undef TARGET_ARG_PARTIAL_BYTES #define TARGET_ARG_PARTIAL_BYTES sh_arg_partial_bytes +#undef TARGET_FUNCTION_ARG +#define TARGET_FUNCTION_ARG sh_function_arg +#undef TARGET_FUNCTION_ARG_ADVANCE +#define TARGET_FUNCTION_ARG_ADVANCE sh_function_arg_advance #undef TARGET_BUILD_BUILTIN_VA_LIST #define TARGET_BUILD_BUILTIN_VA_LIST sh_build_builtin_va_list @@ -8166,10 +8174,9 @@ sh_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode, NPARM_REGS words is at least partially passed in a register unless its data type forbids. */ - -rtx +static rtx sh_function_arg (CUMULATIVE_ARGS *ca, enum machine_mode mode, - tree type, int named) + const_tree type, bool named) { if (! TARGET_SH5 && mode == VOIDmode) return GEN_INT (ca->renesas_abi ? 1 : 0); @@ -8255,17 +8262,17 @@ sh_function_arg (CUMULATIVE_ARGS *ca, enum machine_mode mode, (TYPE is null for libcalls where that information may not be available.) */ -void +static void sh_function_arg_advance (CUMULATIVE_ARGS *ca, enum machine_mode mode, - tree type, int named) + const_tree type, bool named) { if (ca->force_mem) ca->force_mem = 0; else if (TARGET_SH5) { - tree type2 = (ca->byref && type - ? TREE_TYPE (type) - : type); + const_tree type2 = (ca->byref && type + ? TREE_TYPE (type) + : type); enum machine_mode mode2 = (ca->byref && type ? TYPE_MODE (type2) : mode); @@ -11424,9 +11431,9 @@ sh_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, { tree ptype = build_pointer_type (TREE_TYPE (funtype)); - FUNCTION_ARG_ADVANCE (cum, Pmode, ptype, 1); + sh_function_arg_advance (&cum, Pmode, ptype, true); } - this_rtx = FUNCTION_ARG (cum, Pmode, ptr_type_node, 1); + this_rtx = sh_function_arg (&cum, Pmode, ptr_type_node, true); /* For SHcompact, we only have r0 for a scratch register: r1 is the static chain pointer (even if you can't have nested virtual functions diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index ee3e059..cb78667 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -1625,17 +1625,12 @@ struct sh_args { #define INIT_CUMULATIVE_LIBCALL_ARGS(CUM, MODE, LIBNAME) \ sh_init_cumulative_args (& (CUM), NULL_TREE, (LIBNAME), NULL_TREE, 0, (MODE)) -#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ - sh_function_arg_advance (&(CUM), (MODE), (TYPE), (NAMED)) -#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ - sh_function_arg (&(CUM), (MODE), (TYPE), (NAMED)) - /* Return boolean indicating arg of mode MODE will be passed in a reg. This macro is only used in this file. */ #define PASS_IN_REG_P(CUM, MODE, TYPE) \ (((TYPE) == 0 \ - || (! TREE_ADDRESSABLE ((tree)(TYPE)) \ + || (! TREE_ADDRESSABLE ((TYPE)) \ && (! (TARGET_HITACHI || (CUM).renesas_abi) \ || ! (AGGREGATE_TYPE_P (TYPE) \ || (!TARGET_FPU_ANY \