]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add a target hook for getting an ABI from a function type
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 30 Sep 2019 16:19:43 +0000 (16:19 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 30 Sep 2019 16:19:43 +0000 (16:19 +0000)
This patch adds a target hook that allows targets to return
the ABI associated with a particular function type.  Generally,
when multiple ABIs are in use, it must be possible to tell from
a function type and its attributes which ABI it is using.

2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* target.def (fntype_abi): New target hook.
* doc/tm.texi.in (TARGET_FNTYPE_ABI): Likewise.
* doc/tm.texi: Regenerate.
* target.h (predefined_function_abi): Declare.
* function-abi.cc (fntype_abi): Call targetm.calls.fntype_abi,
if defined.
* config/aarch64/aarch64.h (ARM_PCS_SIMD): New arm_pcs value.
* config/aarch64/aarch64.c: Include function-abi.h.
(aarch64_simd_abi, aarch64_fntype_abi): New functions.
(TARGET_FNTYPE_ABI): Define.

From-SVN: r276308

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.h
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/function-abi.cc
gcc/target.def
gcc/target.h

index 858f5962cf4d2ded526caa959ed664792aebddf8..812dadbc8e948ddc455a4b976bf7a8748c98702e 100644 (file)
@@ -1,3 +1,16 @@
+2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * target.def (fntype_abi): New target hook.
+       * doc/tm.texi.in (TARGET_FNTYPE_ABI): Likewise.
+       * doc/tm.texi: Regenerate.
+       * target.h (predefined_function_abi): Declare.
+       * function-abi.cc (fntype_abi): Call targetm.calls.fntype_abi,
+       if defined.
+       * config/aarch64/aarch64.h (ARM_PCS_SIMD): New arm_pcs value.
+       * config/aarch64/aarch64.c: Include function-abi.h.
+       (aarch64_simd_abi, aarch64_fntype_abi): New functions.
+       (TARGET_FNTYPE_ABI): Define.
+
 2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>
 
        * Makefile.in (OBJS): Add function-abi.o.
index 29c070d9b99b8aa4782a19737246784363af126b..211459c29c477870d4877639a2f89618e833e127 100644 (file)
@@ -74,6 +74,7 @@
 #include "rtx-vector-builder.h"
 #include "intl.h"
 #include "expmed.h"
+#include "function-abi.h"
 
 /* This file should be included last.  */
 #include "target-def.h"
@@ -1365,6 +1366,24 @@ svpattern_token (enum aarch64_svpattern pattern)
   gcc_unreachable ();
 }
 
+/* Return the descriptor of the SIMD ABI.  */
+
+static const predefined_function_abi &
+aarch64_simd_abi (void)
+{
+  predefined_function_abi &simd_abi = function_abis[ARM_PCS_SIMD];
+  if (!simd_abi.initialized_p ())
+    {
+      HARD_REG_SET full_reg_clobbers
+       = default_function_abi.full_reg_clobbers ();
+      for (int regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
+       if (FP_SIMD_SAVED_REGNUM_P (regno))
+         CLEAR_HARD_REG_BIT (full_reg_clobbers, regno);
+      simd_abi.initialize (ARM_PCS_SIMD, full_reg_clobbers);
+    }
+  return simd_abi;
+}
+
 /* Generate code to enable conditional branches in functions over 1 MiB.  */
 const char *
 aarch64_gen_far_branch (rtx * operands, int pos_label, const char * dest,
@@ -1810,6 +1829,16 @@ aarch64_hard_regno_mode_ok (unsigned regno, machine_mode mode)
   return false;
 }
 
+/* Implement TARGET_FNTYPE_ABI.  */
+
+static const predefined_function_abi &
+aarch64_fntype_abi (const_tree fntype)
+{
+  if (lookup_attribute ("aarch64_vector_pcs", TYPE_ATTRIBUTES (fntype)))
+    return aarch64_simd_abi ();
+  return default_function_abi;
+}
+
 /* Return true if this is a definition of a vectorized simd function.  */
 
 static bool
@@ -21024,6 +21053,9 @@ aarch64_libgcc_floating_mode_supported_p
 #undef TARGET_GET_MULTILIB_ABI_NAME
 #define TARGET_GET_MULTILIB_ABI_NAME aarch64_get_multilib_abi_name
 
+#undef TARGET_FNTYPE_ABI
+#define TARGET_FNTYPE_ABI aarch64_fntype_abi
+
 #if CHECKING_P
 #undef TARGET_RUN_TARGET_SELFTESTS
 #define TARGET_RUN_TARGET_SELFTESTS selftest::aarch64_run_selftests
index 7bbeed453cf87382b1776ff52991b5cf6ab9204e..5aff106694f4117d6b608a21359f6dff42fc30c6 100644 (file)
@@ -783,6 +783,7 @@ enum aarch64_abi_type
 enum arm_pcs
 {
   ARM_PCS_AAPCS64,             /* Base standard AAPCS for 64 bit.  */
+  ARM_PCS_SIMD,                        /* For aarch64_vector_pcs functions.  */
   ARM_PCS_UNKNOWN
 };
 
index a86c210d4fe390bd0356b6e50ba7c6c34a36239a..0f79d382379f0f10fbe17198d34bb16628cbedea 100644 (file)
@@ -1895,6 +1895,16 @@ Exactly one of @code{CALL_USED_REGISTERS} and @code{CALL_REALLY_USED_REGISTERS}
 must be defined.  Modern ports should define @code{CALL_REALLY_USED_REGISTERS}.
 @end defmac
 
+@cindex call-used register
+@cindex call-clobbered register
+@cindex call-saved register
+@deftypefn {Target Hook} {const predefined_function_abi &} TARGET_FNTYPE_ABI (const_tree @var{type})
+Return the ABI used by a function with type @var{type}; see the
+definition of @code{predefined_function_abi} for details of the ABI
+descriptor.  Targets only need to define this hook if they support
+interoperability between several ABIs in the same translation unit.
+@end deftypefn
+
 @cindex call-used register
 @cindex call-clobbered register
 @cindex call-saved register
index 06dfcda35abea7396c288a59c38ee4ef57c6fef6..ed605c05f4be64f096d1b88c2def1313ff99ab45 100644 (file)
@@ -1706,6 +1706,11 @@ Exactly one of @code{CALL_USED_REGISTERS} and @code{CALL_REALLY_USED_REGISTERS}
 must be defined.  Modern ports should define @code{CALL_REALLY_USED_REGISTERS}.
 @end defmac
 
+@cindex call-used register
+@cindex call-clobbered register
+@cindex call-saved register
+@hook TARGET_FNTYPE_ABI
+
 @cindex call-used register
 @cindex call-clobbered register
 @cindex call-saved register
index e7c85816a125f1545523ac21f2e171a7e0e172a0..c77989a1b08d6ab4ed2193f6d460722e6e0d8fee 100644 (file)
@@ -132,6 +132,8 @@ const predefined_function_abi &
 fntype_abi (const_tree type)
 {
   gcc_assert (FUNC_OR_METHOD_TYPE_P (type));
+  if (targetm.calls.fntype_abi)
+    return targetm.calls.fntype_abi (type);
   return default_function_abi;
 }
 
index f9446fa05a22c79154c2ef36d3d8aea48a5efcc6..803c7a358251859634e791d851ca64186b1b90ec 100644 (file)
@@ -4943,6 +4943,15 @@ If this hook is not defined, then FUNCTION_VALUE_REGNO_P will be used.",
  bool, (const unsigned int regno),
  default_function_value_regno_p)
 
+DEFHOOK
+(fntype_abi,
+ "Return the ABI used by a function with type @var{type}; see the\n\
+definition of @code{predefined_function_abi} for details of the ABI\n\
+descriptor.  Targets only need to define this hook if they support\n\
+interoperability between several ABIs in the same translation unit.",
+ const predefined_function_abi &, (const_tree type),
+ NULL)
+
 /* ??? Documenting this hook requires a GFDL license grant.  */
 DEFHOOK_UNDOC
 (internal_arg_pointer,
index a65693049b2093c4539248503c0146d6c8a347ac..9f80658d8c8e8a1fbcfe279c7a28f2c43afa175d 100644 (file)
@@ -152,6 +152,9 @@ class _stmt_vec_info;
 /* This is defined in calls.h.  */
 class function_arg_info;
 
+/* This is defined in function-abi.h.  */
+class predefined_function_abi;
+
 /* These are defined in tree-vect-stmts.c.  */
 extern tree stmt_vectype (class _stmt_vec_info *);
 extern bool stmt_in_inner_loop_p (class _stmt_vec_info *);