Index: gcc/config/pa/pa.h
===================================================================
--- gcc/config/pa/pa.h	2018-01-03 11:12:55.202783713 +0000
+++ gcc/config/pa/pa.h	2018-01-16 10:50:31.245063090 +0000
@@ -592,15 +592,6 @@ #define INIT_CUMULATIVE_INCOMING_ARGS(CU
   (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.
Index: gcc/config/pa/pa-protos.h
===================================================================
--- gcc/config/pa/pa-protos.h	2018-01-03 11:12:55.198783870 +0000
+++ gcc/config/pa/pa-protos.h	2018-01-16 10:50:31.244063125 +0000
@@ -107,5 +107,6 @@ extern void pa_asm_output_aligned_local
 					 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[];
Index: gcc/config/pa/som.h
===================================================================
--- gcc/config/pa/som.h	2018-01-03 11:12:55.191784145 +0000
+++ gcc/config/pa/som.h	2018-01-16 10:50:31.246063055 +0000
@@ -136,8 +136,8 @@ #define ASM_DECLARE_FUNCTION_NAME(FILE,
 		 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					\
Index: gcc/config/pa/pa.c
===================================================================
--- gcc/config/pa/pa.c	2018-01-03 11:12:55.201783752 +0000
+++ gcc/config/pa/pa.c	2018-01-16 10:50:31.245063090 +0000
@@ -9485,7 +9485,7 @@ pa_function_arg_advance (cumulative_args
 			 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
   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
   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 macro 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"
