Turn FUNCTION_ARG_OFFSET into a hook
2017-09-13 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * target.def (function_arg_offset): New hook. * targhooks.h (default_function_arg_offset): Declare. * targhooks.c (default_function_arg_offset): New function. * function.c (locate_and_pad_parm): Use targetm.calls.function_arg_offset instead of FUNCTION_ARG_OFFSET. * doc/tm.texi.in (FUNCTION_ARG_OFFSET): Replace with... (TARGET_FUNCTION_ARG_OFFSET): ...this. * doc/tm.texi: Regenerate. * config/spu/spu.h (FUNCTION_ARG_OFFSET): Delete. * config/spu/spu.c (spu_function_arg_offset): New function. (TARGET_FUNCTION_ARG_OFFSET): Redefine. * system.h (FUNCTION_ARG_OFFSET): Poison. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r252821
This commit is contained in:
parent
bb149ca2e9
commit
870118b7f1
@ -1,3 +1,20 @@
|
|||||||
|
2017-09-15 Richard Sandiford <richard.sandiford@linaro.org>
|
||||||
|
Alan Hayward <alan.hayward@arm.com>
|
||||||
|
David Sherwood <david.sherwood@arm.com>
|
||||||
|
|
||||||
|
* target.def (function_arg_offset): New hook.
|
||||||
|
* targhooks.h (default_function_arg_offset): Declare.
|
||||||
|
* targhooks.c (default_function_arg_offset): New function.
|
||||||
|
* function.c (locate_and_pad_parm): Use
|
||||||
|
targetm.calls.function_arg_offset instead of FUNCTION_ARG_OFFSET.
|
||||||
|
* doc/tm.texi.in (FUNCTION_ARG_OFFSET): Replace with...
|
||||||
|
(TARGET_FUNCTION_ARG_OFFSET): ...this.
|
||||||
|
* doc/tm.texi: Regenerate.
|
||||||
|
* config/spu/spu.h (FUNCTION_ARG_OFFSET): Delete.
|
||||||
|
* config/spu/spu.c (spu_function_arg_offset): New function.
|
||||||
|
(TARGET_FUNCTION_ARG_OFFSET): Redefine.
|
||||||
|
* system.h (FUNCTION_ARG_OFFSET): Poison.
|
||||||
|
|
||||||
2017-09-15 Richard Sandiford <richard.sandiford@linaro.org>
|
2017-09-15 Richard Sandiford <richard.sandiford@linaro.org>
|
||||||
Alan Hayard <alan.hayward@arm.com>
|
Alan Hayard <alan.hayward@arm.com>
|
||||||
David Sherwood <david.sherwood@arm.com>
|
David Sherwood <david.sherwood@arm.com>
|
||||||
|
@ -3881,6 +3881,18 @@ spu_function_arg_advance (cumulative_args_t cum_v, machine_mode mode,
|
|||||||
: spu_hard_regno_nregs (FIRST_ARG_REGNUM, mode));
|
: spu_hard_regno_nregs (FIRST_ARG_REGNUM, mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Implement TARGET_FUNCTION_ARG_OFFSET. The SPU ABI wants 32/64-bit
|
||||||
|
types at offset 0 in the quad-word on the stack. 8/16-bit types
|
||||||
|
should be at offsets 3/2 respectively. */
|
||||||
|
|
||||||
|
static HOST_WIDE_INT
|
||||||
|
spu_function_arg_offset (machine_mode mode, const_tree type)
|
||||||
|
{
|
||||||
|
if (type && INTEGRAL_TYPE_P (type) && GET_MODE_SIZE (mode) < 4)
|
||||||
|
return 4 - GET_MODE_SIZE (mode);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Implement TARGET_FUNCTION_ARG_PADDING. */
|
/* Implement TARGET_FUNCTION_ARG_PADDING. */
|
||||||
|
|
||||||
static pad_direction
|
static pad_direction
|
||||||
@ -7300,6 +7312,9 @@ static const struct attribute_spec spu_attribute_table[] =
|
|||||||
#undef TARGET_FUNCTION_ARG_ADVANCE
|
#undef TARGET_FUNCTION_ARG_ADVANCE
|
||||||
#define TARGET_FUNCTION_ARG_ADVANCE spu_function_arg_advance
|
#define TARGET_FUNCTION_ARG_ADVANCE spu_function_arg_advance
|
||||||
|
|
||||||
|
#undef TARGET_FUNCTION_ARG_OFFSET
|
||||||
|
#define TARGET_FUNCTION_ARG_OFFSET spu_function_arg_offset
|
||||||
|
|
||||||
#undef TARGET_FUNCTION_ARG_PADDING
|
#undef TARGET_FUNCTION_ARG_PADDING
|
||||||
#define TARGET_FUNCTION_ARG_PADDING spu_function_arg_padding
|
#define TARGET_FUNCTION_ARG_PADDING spu_function_arg_padding
|
||||||
|
|
||||||
|
@ -309,13 +309,6 @@ targetm.resolve_overloaded_builtin = spu_resolve_overloaded_builtin; \
|
|||||||
#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS) \
|
#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS) \
|
||||||
((CUM) = 0)
|
((CUM) = 0)
|
||||||
|
|
||||||
/* The SPU ABI wants 32/64-bit types at offset 0 in the quad-word on the
|
|
||||||
stack. 8/16-bit types should be at offsets 3/2 respectively. */
|
|
||||||
#define FUNCTION_ARG_OFFSET(MODE, TYPE) \
|
|
||||||
(((TYPE) && INTEGRAL_TYPE_P (TYPE) && GET_MODE_SIZE (MODE) < 4) \
|
|
||||||
? (4 - GET_MODE_SIZE (MODE)) \
|
|
||||||
: 0)
|
|
||||||
|
|
||||||
#define PAD_VARARGS_DOWN 0
|
#define PAD_VARARGS_DOWN 0
|
||||||
|
|
||||||
#define FUNCTION_ARG_REGNO_P(N) ((N) >= (FIRST_ARG_REGNUM) && (N) <= (LAST_ARG_REGNUM))
|
#define FUNCTION_ARG_REGNO_P(N) ((N) >= (FIRST_ARG_REGNUM) && (N) <= (LAST_ARG_REGNUM))
|
||||||
|
@ -4079,13 +4079,13 @@ on the stack. The compiler knows how to track the amount of stack space
|
|||||||
used for arguments without any special help.
|
used for arguments without any special help.
|
||||||
@end deftypefn
|
@end deftypefn
|
||||||
|
|
||||||
@defmac FUNCTION_ARG_OFFSET (@var{mode}, @var{type})
|
@deftypefn {Target Hook} HOST_WIDE_INT TARGET_FUNCTION_ARG_OFFSET (machine_mode @var{mode}, const_tree @var{type})
|
||||||
If defined, a C expression that is the number of bytes to add to the
|
This hook returns the number of bytes to add to the offset of an
|
||||||
offset of the argument passed in memory. This is needed for the SPU,
|
argument of type @var{type} and mode @var{mode} when passed in memory.
|
||||||
which passes @code{char} and @code{short} arguments in the preferred
|
This is needed for the SPU, which passes @code{char} and @code{short}
|
||||||
slot that is in the middle of the quad word instead of starting at the
|
arguments in the preferred slot that is in the middle of the quad word
|
||||||
top.
|
instead of starting at the top. The default implementation returns 0.
|
||||||
@end defmac
|
@end deftypefn
|
||||||
|
|
||||||
@deftypefn {Target Hook} pad_direction TARGET_FUNCTION_ARG_PADDING (machine_mode @var{mode}, const_tree @var{type})
|
@deftypefn {Target Hook} pad_direction TARGET_FUNCTION_ARG_PADDING (machine_mode @var{mode}, const_tree @var{type})
|
||||||
This hook determines whether, and in which direction, to pad out
|
This hook determines whether, and in which direction, to pad out
|
||||||
|
@ -3281,13 +3281,7 @@ argument @var{libname} exists for symmetry with
|
|||||||
|
|
||||||
@hook TARGET_FUNCTION_ARG_ADVANCE
|
@hook TARGET_FUNCTION_ARG_ADVANCE
|
||||||
|
|
||||||
@defmac FUNCTION_ARG_OFFSET (@var{mode}, @var{type})
|
@hook TARGET_FUNCTION_ARG_OFFSET
|
||||||
If defined, a C expression that is the number of bytes to add to the
|
|
||||||
offset of the argument passed in memory. This is needed for the SPU,
|
|
||||||
which passes @code{char} and @code{short} arguments in the preferred
|
|
||||||
slot that is in the middle of the quad word instead of starting at the
|
|
||||||
top.
|
|
||||||
@end defmac
|
|
||||||
|
|
||||||
@hook TARGET_FUNCTION_ARG_PADDING
|
@hook TARGET_FUNCTION_ARG_PADDING
|
||||||
|
|
||||||
|
@ -4249,9 +4249,8 @@ locate_and_pad_parm (machine_mode passed_mode, tree type, int in_regs,
|
|||||||
locate->size.constant -= part_size_in_regs;
|
locate->size.constant -= part_size_in_regs;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FUNCTION_ARG_OFFSET
|
locate->offset.constant
|
||||||
locate->offset.constant += FUNCTION_ARG_OFFSET (passed_mode, type);
|
+= targetm.calls.function_arg_offset (passed_mode, type);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
|
/* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
|
||||||
|
@ -915,7 +915,7 @@ extern void fancy_abort (const char *, int, const char *)
|
|||||||
MODES_TIEABLE_P FUNCTION_ARG_PADDING SLOW_UNALIGNED_ACCESS \
|
MODES_TIEABLE_P FUNCTION_ARG_PADDING SLOW_UNALIGNED_ACCESS \
|
||||||
HARD_REGNO_NREGS SECONDARY_MEMORY_NEEDED_MODE \
|
HARD_REGNO_NREGS SECONDARY_MEMORY_NEEDED_MODE \
|
||||||
SECONDARY_MEMORY_NEEDED CANNOT_CHANGE_MODE_CLASS \
|
SECONDARY_MEMORY_NEEDED CANNOT_CHANGE_MODE_CLASS \
|
||||||
TRULY_NOOP_TRUNCATION
|
TRULY_NOOP_TRUNCATION FUNCTION_ARG_OFFSET
|
||||||
|
|
||||||
/* Target macros only used for code built for the target, that have
|
/* Target macros only used for code built for the target, that have
|
||||||
moved to libgcc-tm.h or have never been present elsewhere. */
|
moved to libgcc-tm.h or have never been present elsewhere. */
|
||||||
|
@ -4572,6 +4572,16 @@ used for arguments without any special help.",
|
|||||||
(cumulative_args_t ca, machine_mode mode, const_tree type, bool named),
|
(cumulative_args_t ca, machine_mode mode, const_tree type, bool named),
|
||||||
default_function_arg_advance)
|
default_function_arg_advance)
|
||||||
|
|
||||||
|
DEFHOOK
|
||||||
|
(function_arg_offset,
|
||||||
|
"This hook returns the number of bytes to add to the offset of an\n\
|
||||||
|
argument of type @var{type} and mode @var{mode} when passed in memory.\n\
|
||||||
|
This is needed for the SPU, which passes @code{char} and @code{short}\n\
|
||||||
|
arguments in the preferred slot that is in the middle of the quad word\n\
|
||||||
|
instead of starting at the top. The default implementation returns 0.",
|
||||||
|
HOST_WIDE_INT, (machine_mode mode, const_tree type),
|
||||||
|
default_function_arg_offset)
|
||||||
|
|
||||||
DEFHOOK
|
DEFHOOK
|
||||||
(function_arg_padding,
|
(function_arg_padding,
|
||||||
"This hook determines whether, and in which direction, to pad out\n\
|
"This hook determines whether, and in which direction, to pad out\n\
|
||||||
|
@ -734,6 +734,14 @@ default_function_arg_advance (cumulative_args_t ca ATTRIBUTE_UNUSED,
|
|||||||
gcc_unreachable ();
|
gcc_unreachable ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Default implementation of TARGET_FUNCTION_ARG_OFFSET. */
|
||||||
|
|
||||||
|
HOST_WIDE_INT
|
||||||
|
default_function_arg_offset (machine_mode, const_tree)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Default implementation of TARGET_FUNCTION_ARG_PADDING: usually pad
|
/* Default implementation of TARGET_FUNCTION_ARG_PADDING: usually pad
|
||||||
upward, but pad short args downward on big-endian machines. */
|
upward, but pad short args downward on big-endian machines. */
|
||||||
|
|
||||||
|
@ -132,6 +132,7 @@ extern const char *hook_invalid_arg_for_unprototyped_fn
|
|||||||
(const_tree, const_tree, const_tree);
|
(const_tree, const_tree, const_tree);
|
||||||
extern void default_function_arg_advance
|
extern void default_function_arg_advance
|
||||||
(cumulative_args_t, machine_mode, const_tree, bool);
|
(cumulative_args_t, machine_mode, const_tree, bool);
|
||||||
|
extern HOST_WIDE_INT default_function_arg_offset (machine_mode, const_tree);
|
||||||
extern pad_direction default_function_arg_padding (machine_mode, const_tree);
|
extern pad_direction default_function_arg_padding (machine_mode, const_tree);
|
||||||
extern rtx default_function_arg
|
extern rtx default_function_arg
|
||||||
(cumulative_args_t, machine_mode, const_tree, bool);
|
(cumulative_args_t, machine_mode, const_tree, bool);
|
||||||
|
Loading…
Reference in New Issue
Block a user