Turn FUNCTION_ARG_OFFSET into a hook

Message ID 871snabdyo.fsf@linaro.org
State New
Headers show
Series
  • Turn FUNCTION_ARG_OFFSET into a hook
Related show

Commit Message

Richard Sandiford Sept. 13, 2017, 7:22 p.m.
Nice and easy, one definition and one use :-)

Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.
Also tested by comparing the testsuite assembly output on at least one
target per CPU directory.  OK to install?

Richard


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.

Comments

Jeff Law Sept. 14, 2017, 4:45 p.m. | #1
On 09/13/2017 01:22 PM, Richard Sandiford wrote:
> Nice and easy, one definition and one use :-)

> 

> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.

> Also tested by comparing the testsuite assembly output on at least one

> target per CPU directory.  OK to install?

> 

> Richard

> 

> 

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

OK.
jeff

Patch

Index: gcc/target.def
===================================================================
--- gcc/target.def	2017-09-13 20:12:24.499190740 +0100
+++ gcc/target.def	2017-09-13 20:14:46.245761652 +0100
@@ -4573,6 +4573,16 @@  used for arguments without any special h
  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
 (function_arg_padding,
  "This hook determines whether, and in which direction, to pad out\n\
 an argument of mode @var{mode} and type @var{type}.  It returns\n\
Index: gcc/targhooks.h
===================================================================
--- gcc/targhooks.h	2017-09-13 18:03:51.114330107 +0100
+++ gcc/targhooks.h	2017-09-13 20:14:46.245761652 +0100
@@ -132,6 +132,7 @@  extern bool hook_bool_CUMULATIVE_ARGS_tr
   (const_tree, const_tree, const_tree);
 extern void default_function_arg_advance
   (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 rtx default_function_arg
   (cumulative_args_t, machine_mode, const_tree, bool);
Index: gcc/targhooks.c
===================================================================
--- gcc/targhooks.c	2017-09-13 18:03:51.114330107 +0100
+++ gcc/targhooks.c	2017-09-13 20:14:46.245761652 +0100
@@ -734,6 +734,14 @@  default_function_arg_advance (cumulative
   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
    upward, but pad short args downward on big-endian machines.  */
 
Index: gcc/function.c
===================================================================
--- gcc/function.c	2017-09-13 20:12:24.498282217 +0100
+++ gcc/function.c	2017-09-13 20:14:46.244854334 +0100
@@ -4249,9 +4249,8 @@  locate_and_pad_parm (machine_mode passed
       locate->size.constant -= part_size_in_regs;
     }
 
-#ifdef FUNCTION_ARG_OFFSET
-  locate->offset.constant += FUNCTION_ARG_OFFSET (passed_mode, type);
-#endif
+  locate->offset.constant
+    += targetm.calls.function_arg_offset (passed_mode, type);
 }
 
 /* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
Index: gcc/doc/tm.texi.in
===================================================================
--- gcc/doc/tm.texi.in	2017-09-13 20:12:24.496465170 +0100
+++ gcc/doc/tm.texi.in	2017-09-13 20:14:46.243947015 +0100
@@ -3281,13 +3281,7 @@  argument @var{libname} exists for symmet
 
 @hook TARGET_FUNCTION_ARG_ADVANCE
 
-@defmac FUNCTION_ARG_OFFSET (@var{mode}, @var{type})
-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_OFFSET
 
 @hook TARGET_FUNCTION_ARG_PADDING
 
Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi	2017-09-13 20:12:24.496465170 +0100
+++ gcc/doc/tm.texi	2017-09-13 20:14:46.243947015 +0100
@@ -4079,13 +4079,13 @@  on the stack.  The compiler knows how to
 used for arguments without any special help.
 @end deftypefn
 
-@defmac FUNCTION_ARG_OFFSET (@var{mode}, @var{type})
-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
+@deftypefn {Target Hook} HOST_WIDE_INT TARGET_FUNCTION_ARG_OFFSET (machine_mode @var{mode}, const_tree @var{type})
+This hook returns the number of bytes to add to the offset of an
+argument of type @var{type} and mode @var{mode} when 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.  The default implementation returns 0.
+@end deftypefn
 
 @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
Index: gcc/config/spu/spu.h
===================================================================
--- gcc/config/spu/spu.h	2017-09-13 20:12:24.493739600 +0100
+++ gcc/config/spu/spu.h	2017-09-13 20:14:46.241225060 +0100
@@ -309,13 +309,6 @@  #define CUMULATIVE_ARGS int
 #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS) \
 		((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 FUNCTION_ARG_REGNO_P(N) ((N) >= (FIRST_ARG_REGNUM) && (N) <= (LAST_ARG_REGNUM))
Index: gcc/config/spu/spu.c
===================================================================
--- gcc/config/spu/spu.c	2017-09-13 20:12:24.493739600 +0100
+++ gcc/config/spu/spu.c	2017-09-13 20:14:46.241225060 +0100
@@ -3881,6 +3881,18 @@  spu_function_arg_advance (cumulative_arg
 	   : 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.  */
 
 static pad_direction
@@ -7300,6 +7312,9 @@  #define TARGET_FUNCTION_ARG spu_function
 #undef TARGET_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
 #define TARGET_FUNCTION_ARG_PADDING spu_function_arg_padding
 
Index: gcc/system.h
===================================================================
--- gcc/system.h	2017-09-13 20:12:24.498282217 +0100
+++ gcc/system.h	2017-09-13 20:14:46.244854334 +0100
@@ -915,7 +915,7 @@  #define realloc xrealloc
 	MODES_TIEABLE_P FUNCTION_ARG_PADDING SLOW_UNALIGNED_ACCESS	\
 	HARD_REGNO_NREGS SECONDARY_MEMORY_NEEDED_MODE			\
 	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
    moved to libgcc-tm.h or have never been present elsewhere.  */