diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-01-16 14:47:49 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-01-16 14:47:49 +0000 |
commit | 42b394ff00b100d2c968db6478c87a259333ccec (patch) | |
tree | 1f87d503f8f4e3964fd917081808878aa74dc891 /gcc/config/pa/pa.c | |
parent | 859116618eb4ca3b8727fc401eddeb83c5b7866e (diff) | |
download | gcc-42b394ff00b100d2c968db6478c87a259333ccec.zip gcc-42b394ff00b100d2c968db6478c87a259333ccec.tar.gz gcc-42b394ff00b100d2c968db6478c87a259333ccec.tar.bz2 |
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
Diffstat (limited to 'gcc/config/pa/pa.c')
-rw-r--r-- | gcc/config/pa/pa.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index a5782fc..8e7b11a 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -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" |