Make TARGET_STATIC_CHAIN allow a function type
authorRichard Henderson <rth@redhat.com>
Wed, 19 Nov 2014 13:30:34 +0000 (05:30 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 19 Nov 2014 13:30:34 +0000 (05:30 -0800)
As opposed to always being a decl.  This is a prerequisite
to allowing the static chain to be loaded for indirect calls.

        * targhooks.c (default_static_chain): Remove check for
        DECL_STATIC_CHAIN.
        * config/moxie/moxie.c (moxie_static_chain): Likewise.
        * config/i386/i386.c (ix86_static_chain): Allow decl or type
        as the first argument.
        * config/xtensa/xtensa.c (xtensa_static_chain): Change the name
        of the unused first parameter.
        * doc/tm.texi (TARGET_STATIC_CHAIN): Document the first parameter
        may be a type.
        * target.def (static_chain): Likewise.

From-SVN: r217769

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/moxie/moxie.c
gcc/config/xtensa/xtensa.c
gcc/doc/tm.texi
gcc/target.def
gcc/targhooks.c

index c5bd5e73ac0df4cb2430ec35eef780a7f9f6914f..9a9cf7bc6ed38926130eb135cce46f3dd5eb3733 100644 (file)
@@ -1,3 +1,16 @@
+2014-11-19  Richard Henderson  <rth@redhat.com>
+
+       * targhooks.c (default_static_chain): Remove check for
+       DECL_STATIC_CHAIN.
+       * config/moxie/moxie.c (moxie_static_chain): Likewise.
+       * config/i386/i386.c (ix86_static_chain): Allow decl or type
+       as the first argument.
+       * config/xtensa/xtensa.c (xtensa_static_chain): Change the name
+       of the unused first parameter.
+       * doc/tm.texi (TARGET_STATIC_CHAIN): Document the first parameter
+       may be a type.
+       * target.def (static_chain): Likewise.
+
 2014-11-19  Renlin Li  <renlin.li@arm.com>
 
     * config/aarch64/aarch64.h (TARGET_CPU_CPP_BUILTINS): Define __ARM_FP_FAST,
index 3166e0378a20e45d199d7fe53490535067515782..3b41de2e4f6480d262ca57e6d9fd5b283657e3ee 100644 (file)
@@ -27356,13 +27356,10 @@ ix86_minimum_alignment (tree exp, 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.  */
@@ -27370,13 +27367,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)
        {
index d4688d9c2f8feb0435818c9ec1a10ef026dc7b3c..148d26be1f59253f8143ee2d6d75c322630e0b5c 100644 (file)
@@ -528,13 +528,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
index 159a1a7646830510e5db35649024fc143a0921ab..a0025a51331540d9b62707365bf67970dcac847f 100644 (file)
@@ -3626,7 +3626,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,
index 0d3a9fd9b9a7e6b0a5f1063cc204810d977f0c40..5b9da4776a1baa3e10e8af15592105ba749bc9c0 100644 (file)
@@ -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
index bc5160d1805940023e94370a8c0bf1a12636b0a5..dc48ae6912e920198516f6580f161fc3bfcd9a10 100644 (file)
@@ -4516,8 +4516,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\
@@ -4539,7 +4539,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
index bef18872bbab9b1355862d67524e27443754d273..42fd82e692b111cb6199c6648124df6c7aaa0a88 100644 (file)
@@ -841,11 +841,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