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