From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12651 invoked by alias); 10 Oct 2014 20:43:36 -0000 Mailing-List: contact libffi-discuss-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libffi-discuss-owner@sourceware.org Received: (qmail 12241 invoked by uid 89); 10 Oct 2014 20:43:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qa0-f54.google.com Received: from mail-qa0-f54.google.com (HELO mail-qa0-f54.google.com) (209.85.216.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Fri, 10 Oct 2014 20:43:29 +0000 Received: by mail-qa0-f54.google.com with SMTP id i13so2193139qae.13 for ; Fri, 10 Oct 2014 13:43:27 -0700 (PDT) X-Received: by 10.224.115.14 with SMTP id g14mr13111181qaq.23.1412973807683; Fri, 10 Oct 2014 13:43:27 -0700 (PDT) Received: from anchor.com (50-194-63-110-static.hfc.comcastbusiness.net. [50.194.63.110]) by mx.google.com with ESMTPSA id s49sm5909008qge.15.2014.10.10.13.43.26 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Oct 2014 13:43:26 -0700 (PDT) From: Richard Henderson To: gcc-patches@gcc.gnu.org Cc: libffi-discuss@sourceware.org, gofrontend-dev@googlegroups.com Subject: [PATCH 01/13] Make TARGET_STATIC_CHAIN allow a function type Date: Fri, 10 Oct 2014 20:43:00 -0000 Message-Id: <1412973773-3942-2-git-send-email-rth@redhat.com> In-Reply-To: <1412973773-3942-1-git-send-email-rth@redhat.com> References: <1412973773-3942-1-git-send-email-rth@redhat.com> X-IsSubscribed: yes X-SW-Source: 2014/txt/msg00101.txt.bz2 As opposed to always being a decl. This is a prerequisite to allowing the static chain to be loaded for indirect calls. --- gcc/config/i386/i386.c | 19 +++++++++++++------ gcc/config/moxie/moxie.c | 5 +---- gcc/config/xtensa/xtensa.c | 2 +- gcc/doc/tm.texi | 2 +- gcc/target.def | 6 +++--- gcc/targhooks.c | 5 +---- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 4c4a6eb..d39e91b 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -26845,13 +26845,10 @@ ix86_minimum_alignment (tree exp, enum machine_mode mode, This is a register, unless all free registers are used by arguments. */ static rtx -ix86_static_chain (const_tree fndecl, bool incoming_p) +ix86_static_chain (const_tree fndecl_or_type, bool incoming_p) { unsigned regno; - if (!DECL_STATIC_CHAIN (fndecl)) - return NULL; - if (TARGET_64BIT) { /* We always use R10 in 64-bit mode. */ @@ -26859,13 +26856,23 @@ ix86_static_chain (const_tree fndecl, bool incoming_p) } else { - tree fntype; + const_tree fntype, fndecl; unsigned int ccvt; /* By default in 32-bit mode we use ECX to pass the static chain. */ regno = CX_REG; - fntype = TREE_TYPE (fndecl); + if (TREE_CODE (fndecl_or_type) == FUNCTION_DECL) + { + fntype = TREE_TYPE (fndecl_or_type); + fndecl = fndecl_or_type; + } + else + { + fntype = fndecl_or_type; + fndecl = NULL; + } + ccvt = ix86_get_callcvt (fntype); if ((ccvt & IX86_CALLCVT_FASTCALL) != 0) { diff --git a/gcc/config/moxie/moxie.c b/gcc/config/moxie/moxie.c index 1e289068..2aa06fd 100644 --- a/gcc/config/moxie/moxie.c +++ b/gcc/config/moxie/moxie.c @@ -513,13 +513,10 @@ moxie_arg_partial_bytes (cumulative_args_t cum_v, /* Worker function for TARGET_STATIC_CHAIN. */ static rtx -moxie_static_chain (const_tree fndecl, bool incoming_p) +moxie_static_chain (const_tree ARG_UNUSED (fndecl_or_type), bool incoming_p) { rtx addr, mem; - if (!DECL_STATIC_CHAIN (fndecl)) - return NULL; - if (incoming_p) addr = plus_constant (Pmode, arg_pointer_rtx, 2 * UNITS_PER_WORD); else diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c index dc0629a..6c5d4fb 100644 --- a/gcc/config/xtensa/xtensa.c +++ b/gcc/config/xtensa/xtensa.c @@ -3603,7 +3603,7 @@ xtensa_function_value_regno_p (const unsigned int regno) expressions that denote where they are stored. */ static rtx -xtensa_static_chain (const_tree ARG_UNUSED (fndecl), bool incoming_p) +xtensa_static_chain (const_tree ARG_UNUSED (fndecl_or_type), bool incoming_p) { rtx base = incoming_p ? arg_pointer_rtx : stack_pointer_rtx; return gen_frame_mem (Pmode, plus_constant (Pmode, base, diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 10af50e..557d6b5 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -3462,7 +3462,7 @@ If the static chain is passed in memory, these macros should not be defined; instead, the @code{TARGET_STATIC_CHAIN} hook should be used. @end defmac -@deftypefn {Target Hook} rtx TARGET_STATIC_CHAIN (const_tree @var{fndecl}, bool @var{incoming_p}) +@deftypefn {Target Hook} rtx TARGET_STATIC_CHAIN (const_tree @var{fndecl_or_type}, bool @var{incoming_p}) This hook replaces the use of @code{STATIC_CHAIN_REGNUM} et al for targets that may use different static chain locations for different nested functions. This may be required if the target has function diff --git a/gcc/target.def b/gcc/target.def index ce11eae..b966a72 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -4147,8 +4147,8 @@ false for naked functions. The default implementation always returns true.", bool, (void), hook_bool_void_true) -/* Return an rtx for the static chain for FNDECL. If INCOMING_P is true, - then it should be for the callee; otherwise for the caller. */ +/* Return an rtx for the static chain for FNDECL_OR_TYPE. If INCOMING_P + is true, then it should be for the callee; otherwise for the caller. */ DEFHOOK (static_chain, "This hook replaces the use of @code{STATIC_CHAIN_REGNUM} et al for\n\ @@ -4170,7 +4170,7 @@ will be at an offset from the frame pointer.\n\ The variables @code{stack_pointer_rtx}, @code{frame_pointer_rtx}, and\n\ @code{arg_pointer_rtx} will have been initialized and should be used\n\ to refer to those items.", - rtx, (const_tree fndecl, bool incoming_p), + rtx, (const_tree fndecl_or_type, bool incoming_p), default_static_chain) /* Fill in the trampoline at MEM with a call to FNDECL and a diff --git a/gcc/targhooks.c b/gcc/targhooks.c index 9f15559..99ea5ad 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -837,11 +837,8 @@ default_internal_arg_pointer (void) } rtx -default_static_chain (const_tree fndecl, bool incoming_p) +default_static_chain (const_tree ARG_UNUSED (fndecl_or_type), bool incoming_p) { - if (!DECL_STATIC_CHAIN (fndecl)) - return NULL; - if (incoming_p) { #ifdef STATIC_CHAIN_INCOMING_REGNUM -- 1.9.3