mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-23 00:51:00 +08:00
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
This commit is contained in:
parent
45b70a7372
commit
c21df29bcf
@ -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,
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user