Move pa.h FUNCTION_ARG_SIZE to pa.c (PR83858)

Message ID 87lggyxehb.fsf@linaro.org
State New
Headers show
Series
  • Move pa.h FUNCTION_ARG_SIZE to pa.c (PR83858)
Related show

Commit Message

Richard Sandiford Jan. 16, 2018, 10:52 a.m.
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.

Tested with a cross build of hppa2.0w-hp-hpux11.11.  OK to install?

Richard


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.

Comments

John David Anglin Jan. 16, 2018, 2:42 p.m. | #1
On 2018-01-16 5:52 AM, Richard Sandiford wrote:
> 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.

Thanks Richard.  I started a build yesterday evening with essentially 
the same change.

Two little nits.  I believe a declaration for pa_function_arg_size needs 
to be added
be added to added pa-protos.h.  Secondly, the comment for 
pa_function_arg_size
needs to be updated to say "function" instead of "macro". Otherwise, the 
change
is okay.

I want to see if ASM_DECLARE_FUNCTION_NAME can be turned into a function in
pa.c as well. This would allow pa_function_arg_size to be static.

Dave

-- 
John David Anglin  dave.anglin@bell.net
Richard Sandiford Jan. 16, 2018, 2:48 p.m. | #2
John David Anglin <dave.anglin@bell.net> writes:
> On 2018-01-16 5:52 AM, Richard Sandiford wrote:

>> 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.

> Thanks Richard.  I started a build yesterday evening with essentially 

> the same change.

>

> Two little nits.  I believe a declaration for pa_function_arg_size needs 

> to be added to pa-protos.h.


The patch did have this.

> Secondly, the comment for pa_function_arg_size needs to be updated to

> say "function" instead of "macro". Otherwise, the change is okay.


Oops, yes.  Installed with that change, thanks.

Richard
John David Anglin Jan. 16, 2018, 2:58 p.m. | #3
On 2018-01-16 9:48 AM, Richard Sandiford wrote:
> Oops, yes.  Installed with that change, thanks.

Oops, I just realized the CEIL function needs to be applied to the 
GET_MODE_SIZE
return as well...

Dave

-- 
John David Anglin  dave.anglin@bell.net

Patch

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"