aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2014-11-19 05:30:34 -0800
committerRichard Henderson <rth@gcc.gnu.org>2014-11-19 05:30:34 -0800
commitc21df29bcfc04945d3a7be6a0c6e306fc9efc505 (patch)
treead9460795e6afe6279fd142b74f0096d38d6fcc3 /gcc
parent45b70a7372142320ffcd73d98a5ddc7862ac283c (diff)
downloadgcc-c21df29bcfc04945d3a7be6a0c6e306fc9efc505.zip
gcc-c21df29bcfc04945d3a7be6a0c6e306fc9efc505.tar.gz
gcc-c21df29bcfc04945d3a7be6a0c6e306fc9efc505.tar.bz2
Make TARGET_STATIC_CHAIN allow a function type
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/config/i386/i386.c19
-rw-r--r--gcc/config/moxie/moxie.c5
-rw-r--r--gcc/config/xtensa/xtensa.c2
-rw-r--r--gcc/doc/tm.texi2
-rw-r--r--gcc/target.def6
-rw-r--r--gcc/targhooks.c5
7 files changed, 33 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c5bd5e7..9a9cf7b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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,
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 3166e03..3b41de2 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -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)
{
diff --git a/gcc/config/moxie/moxie.c b/gcc/config/moxie/moxie.c
index d4688d9..148d26b 100644
--- a/gcc/config/moxie/moxie.c
+++ b/gcc/config/moxie/moxie.c
@@ -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
diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c
index 159a1a7..a0025a5 100644
--- a/gcc/config/xtensa/xtensa.c
+++ b/gcc/config/xtensa/xtensa.c
@@ -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,
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 0d3a9fd..5b9da47 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 bc5160d..dc48ae6 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -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
diff --git a/gcc/targhooks.c b/gcc/targhooks.c
index bef1887..42fd82e 100644
--- a/gcc/targhooks.c
+++ b/gcc/targhooks.c
@@ -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