Move pa.h FUNCTION_ARG_SIZE to pa.c (PR83858)
The port-local FUNCTION_ARG_SIZE: ((((MODE) != BLKmode \ ? (HOST_WIDE_INT) GET_MODE_SIZE (MODE) \ : int_size_in_bytes (TYPE)) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) is used by code in pa.c and by ASM_DECLARE_FUNCTION_NAME in som.h. Treating GET_MODE_SIZE as a constant is OK for the former but not the latter, which is used in target-independent code. This caused a build failure on hppa2.0w-hp-hpux11.11. 2018-01-16 Richard Sandiford <richard.sandiford@linaro.org> gcc/ PR target/83858 * config/pa/pa.h (FUNCTION_ARG_SIZE): Delete. * config/pa/pa-protos.h (pa_function_arg_size): Declare. * config/pa/som.h (ASM_DECLARE_FUNCTION_NAME): Use pa_function_arg_size instead of FUNCTION_ARG_SIZE. * config/pa/pa.c (pa_function_arg_advance): Likewise. (pa_function_arg, pa_arg_partial_bytes): Likewise. (pa_function_arg_size): New function. From-SVN: r256744
This commit is contained in:
parent
859116618e
commit
42b394ff00
|
@ -1,3 +1,14 @@
|
|||
2018-01-16 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
|
||||
PR target/83858
|
||||
* config/pa/pa.h (FUNCTION_ARG_SIZE): Delete.
|
||||
* config/pa/pa-protos.h (pa_function_arg_size): Declare.
|
||||
* config/pa/som.h (ASM_DECLARE_FUNCTION_NAME): Use
|
||||
pa_function_arg_size instead of FUNCTION_ARG_SIZE.
|
||||
* config/pa/pa.c (pa_function_arg_advance): Likewise.
|
||||
(pa_function_arg, pa_arg_partial_bytes): Likewise.
|
||||
(pa_function_arg_size): New function.
|
||||
|
||||
2018-01-16 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
|
||||
* fold-const.c (fold_ternary_loc): Construct the vec_perm_indices
|
||||
|
|
|
@ -107,5 +107,6 @@ extern void pa_asm_output_aligned_local (FILE *, const char *,
|
|||
unsigned int);
|
||||
extern void pa_hpux_asm_output_external (FILE *, tree, const char *);
|
||||
extern HOST_WIDE_INT pa_initial_elimination_offset (int, int);
|
||||
extern HOST_WIDE_INT pa_function_arg_size (machine_mode, const_tree);
|
||||
|
||||
extern const int pa_magic_milli[];
|
||||
|
|
|
@ -9485,7 +9485,7 @@ pa_function_arg_advance (cumulative_args_t cum_v, machine_mode mode,
|
|||
const_tree type, bool named ATTRIBUTE_UNUSED)
|
||||
{
|
||||
CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
|
||||
int arg_size = FUNCTION_ARG_SIZE (mode, type);
|
||||
int arg_size = pa_function_arg_size (mode, type);
|
||||
|
||||
cum->nargs_prototype--;
|
||||
cum->words += (arg_size
|
||||
|
@ -9517,7 +9517,7 @@ pa_function_arg (cumulative_args_t cum_v, machine_mode mode,
|
|||
if (mode == VOIDmode)
|
||||
return NULL_RTX;
|
||||
|
||||
arg_size = FUNCTION_ARG_SIZE (mode, type);
|
||||
arg_size = pa_function_arg_size (mode, type);
|
||||
|
||||
/* If this arg would be passed partially or totally on the stack, then
|
||||
this routine should return zero. pa_arg_partial_bytes will
|
||||
|
@ -9724,10 +9724,10 @@ pa_arg_partial_bytes (cumulative_args_t cum_v, machine_mode mode,
|
|||
if (!TARGET_64BIT)
|
||||
return 0;
|
||||
|
||||
if (FUNCTION_ARG_SIZE (mode, type) > 1 && (cum->words & 1))
|
||||
if (pa_function_arg_size (mode, type) > 1 && (cum->words & 1))
|
||||
offset = 1;
|
||||
|
||||
if (cum->words + offset + FUNCTION_ARG_SIZE (mode, type) <= max_arg_words)
|
||||
if (cum->words + offset + pa_function_arg_size (mode, type) <= max_arg_words)
|
||||
/* Arg fits fully into registers. */
|
||||
return 0;
|
||||
else if (cum->words + offset >= max_arg_words)
|
||||
|
@ -10835,4 +10835,16 @@ pa_starting_frame_offset (void)
|
|||
return 8;
|
||||
}
|
||||
|
||||
/* Figure out the size in words of the function argument. The size
|
||||
returned by this function should always be greater than zero because
|
||||
we pass variable and zero sized objects by reference. */
|
||||
|
||||
HOST_WIDE_INT
|
||||
pa_function_arg_size (machine_mode mode, const_tree type)
|
||||
{
|
||||
if (mode != BLKmode)
|
||||
return GET_MODE_SIZE (mode);
|
||||
return CEIL (int_size_in_bytes (type), UNITS_PER_WORD);
|
||||
}
|
||||
|
||||
#include "gt-pa.h"
|
||||
|
|
|
@ -592,15 +592,6 @@ struct hppa_args {int words, nargs_prototype, incoming, indirect; };
|
|||
(CUM).indirect = 0, \
|
||||
(CUM).nargs_prototype = 1000
|
||||
|
||||
/* Figure out the size in words of the function argument. The size
|
||||
returned by this macro should always be greater than zero because
|
||||
we pass variable and zero sized objects by reference. */
|
||||
|
||||
#define FUNCTION_ARG_SIZE(MODE, TYPE) \
|
||||
((((MODE) != BLKmode \
|
||||
? (HOST_WIDE_INT) GET_MODE_SIZE (MODE) \
|
||||
: int_size_in_bytes (TYPE)) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
|
||||
|
||||
/* Determine where to put an argument to a function.
|
||||
Value is zero to push the argument on the stack,
|
||||
or a hard register in which to store the argument.
|
||||
|
|
|
@ -136,8 +136,8 @@ do { \
|
|||
else \
|
||||
{ \
|
||||
int arg_size = \
|
||||
FUNCTION_ARG_SIZE (TYPE_MODE (DECL_ARG_TYPE (parm)),\
|
||||
DECL_ARG_TYPE (parm)); \
|
||||
pa_function_arg_size (TYPE_MODE (DECL_ARG_TYPE (parm)),\
|
||||
DECL_ARG_TYPE (parm)); \
|
||||
/* Passing structs by invisible reference uses \
|
||||
one general register. */ \
|
||||
if (arg_size > 2 \
|
||||
|
|
Loading…
Reference in New Issue