gcc/

        * config/arm/arm.cc (arm_valid_target_attribute_rec): Add ARM function
        attribute 'branch-protection' and parse its options.
        * doc/extend.texi: Document ARM Function attribute 'branch-protection'.

gcc/testsuite/

        * gcc.target/arm/acle/pacbti-m-predef-13.c: New test.

Co-Authored-By: Tejas Belagod  <tbela...@arm.com>
---
 gcc/config/arm/arm.cc                         | 16 ++++++++
 gcc/doc/extend.texi                           |  7 ++++
 .../gcc.target/arm/acle/pacbti-m-predef-13.c  | 41 +++++++++++++++++++
 3 files changed, 64 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/arm/acle/pacbti-m-predef-13.c

diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
index efc48349dd3..add33090f18 100644
--- a/gcc/config/arm/arm.cc
+++ b/gcc/config/arm/arm.cc
@@ -33568,6 +33568,22 @@ arm_valid_target_attribute_rec (tree args, struct 
gcc_options *opts)
 
          opts->x_arm_arch_string = xstrndup (arch, strlen (arch));
        }
+      else if (startswith (q, "branch-protection="))
+       {
+         char *bp_str = q + strlen ("branch-protection=");
+
+         opts->x_arm_branch_protection_string
+           = xstrndup (bp_str, strlen (bp_str));
+
+         /* Capture values from target attribute.  */
+         aarch_validate_mbranch_protection
+           (opts->x_arm_branch_protection_string);
+
+         /* Init function target attr values.  */
+         opts->x_aarch_ra_sign_scope = aarch_ra_sign_scope;
+         opts->x_aarch_enable_bti = aarch_enable_bti;
+
+       }
       else if (q[0] == '+')
        {
          opts->x_arm_arch_string
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 4a89a3eae7c..23ee43919dd 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -4492,6 +4492,13 @@ Enable or disable calls to out-of-line helpers to 
implement atomic operations.
 This corresponds to the behavior of the command line options
 @option{-moutline-atomics} and @option{-mno-outline-atomics}.
 
+@item branch-protection=
+@cindex @code{branch-protection=} function attribute, arm
+Select the function scope on which branch protection will be applied.
+The behavior and permissible arguments are the same as for the
+command-line option @option{-mbranch-protection=}.  The default value
+is @code{none}.
+
 @end table
 
 The above target attributes can be specified as follows:
diff --git a/gcc/testsuite/gcc.target/arm/acle/pacbti-m-predef-13.c 
b/gcc/testsuite/gcc.target/arm/acle/pacbti-m-predef-13.c
new file mode 100644
index 00000000000..b6d2df53072
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/acle/pacbti-m-predef-13.c
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target mbranch_protection_ok } */
+/* { dg-options "-march=armv8.1-m.main+fp -mbranch-protection=pac-ret+leaf 
-mfloat-abi=hard --save-temps" } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#if defined (__ARM_FEATURE_BTI_DEFAULT)
+#error "Feature test macro __ARM_FEATURE_BTI_DEFAULT should be undefined."
+#endif
+
+#if !defined (__ARM_FEATURE_PAC_DEFAULT)
+#error "Feature test macro __ARM_FEATURE_PAC_DEFAULT should be defined."
+#endif
+
+/*
+**foo:
+**     bti
+**     ...
+*/
+__attribute__((target("branch-protection=pac-ret+bti"), noinline))
+int foo ()
+{
+  return 3;
+}
+
+/*
+**main:
+**     pac     ip, lr, sp
+**     ...
+**     aut     ip, lr, sp
+**     bx      lr
+*/
+int
+main()
+{
+  return 1 + foo ();
+}
+
+/* { dg-final { scan-assembler "\.eabi_attribute 50, 1" } } */
+/* { dg-final { scan-assembler "\.eabi_attribute 52, 1" } } */
+/* { dg-final { scan-assembler-not "\.eabi_attribute 74" } } */
+/* { dg-final { scan-assembler "\.eabi_attribute 76, 1" } } */
-- 
2.25.1

Reply via email to