arm: Implement arm Function target attribute 'branch-protection'

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  <tbelagod@arm.com>
This commit is contained in:
Andrea Corallo
2023-01-23 17:38:03 +01:00
parent 9d560b2365
commit 8b7f28f2e8
3 changed files with 64 additions and 0 deletions

View File

@@ -33397,6 +33397,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

View File

@@ -4457,6 +4457,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:

View File

@@ -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" } } */