On 31/10/2022 15:36, Srinath Parvathaneni via Gcc-patches wrote:
Hi,

This patch adds the support for pacbti multlilib linking by making
"-mbranch-protection=none" as default in the command line for all M-profile
targets and uses "-mbranch-protection=none" for multilib matching. If any
valid value is passed to "-mbranch-protection" in the command line, this
new value overwrites the default value in the command line and uses
"-mbranch-protection=standard" for multilib matching.

Eg 1.

If the passed command line flags are:
a) -march=armv8.1-m.main+mve -mfloat-abi=hard -mfpu=auto
b) -mcpu=cortex-m85+nopacbti -mfloat-abi=hard -mfpu=auto

After this patch the command line flags the compiler receives will be:
a) -march=armv8.1-m.main+mve -mfloat-abi=hard -mfpu=auto 
-mbranch-protection=none
b) -mcpu=cortex-m85+nopacbti -mfloat-abi=hard -mfpu=auto 
-mbranch-protection=none

"-mbranch-protection=none" will be used in the multilib matching.

Eg 2.

If the passed command line flags are:
a) -march=armv8.1-m.main+mve+pacbti -mfloat-abi=hard -mfpu=auto  
-mbranch-protection=pac-ret
b) -mcpu=cortex-m85 -mfloat-abi=hard -mfpu=auto  -mbranch-protection=pac-ret+bti

After this patch the command line flags the compiler receives will be:
a) -march=armv8.1-m.main+mve+pacbti -mfloat-abi=hard -mfpu=auto 
-mbranch-protection=pac-ret
b) -mcpu=cortex-m85 -mfloat-abi=hard -mfpu=auto -mbranch-protection=pac-ret+bti

"-mbranch-protection=standard" will be used in the multilib matching.

Eg 3.

For A-profile target, if the passed command line flags are:
-march=armv8-a+simd -mfloat-abi=hard -mfpu=auto

Even after this patch the command line flags compiler receives will remain the 
same:
-march=armv8-a+simd -mfloat-abi=hard -mfpu=auto

Regression tested on arm-none-eabi and bootstrapped on arm-none-linux-gnueabihf.

Ok for master?

Regards,
Srinath.

gcc/ChangeLog:

2022-10-28  Srinath Parvathaneni  <srinath.parvathan...@arm.com>

         * common/config/arm/arm-common.cc
         (arm_canon_branch_protection_option): Define new function.
         * config/arm/arm-cpus.in (armv8.1-m.main): Move dsp option below pacbti
         option.
         * config/arm/arm.h (arm_canon_branch_protection_option): Define 
function
         prototype.
         (CANON_BRANCH_PROTECTION_SPEC_FUNCTION): Define macro.
         (MBRANCH_PROTECTION_SPECS): Likewise.
         * config/arm/t-rmprofile (MULTI_ARCH_OPTS_RM): Add new options.
         (MULTI_ARCH_DIRS_RM): Add new directories.
         (MULTILIB_REQUIRED): Add new option.
         (MULTILIB_REUSE): Reuse existing multlibs.
         (MULTILIB_MATCHES): Match multilib strings.

gcc/testsuite/ChangeLog:

2022-10-28  Srinath Parvathaneni  <srinath.parvathan...@arm.com>

         * gcc.target/arm/multilib.exp (multilib_config "rmprofile"): Update
         tests.
         * gcc.target/arm/pac-10.c: New test.
         * gcc.target/arm/pac-11.c: Likewise.
         * gcc.target/arm/pac-12.c: Likewise.

Your attachment this time is gzipped, which is almost as bad as octet-stream. Please use text/plain attachments.

--- a/gcc/config/arm/arm-cpus.in
+++ b/gcc/config/arm/arm-cpus.in
@@ -746,8 +746,8 @@ begin arch armv8.1-m.main
  profile M
  isa ARMv8_1m_main
 # fp => FPv5-sp-d16; fp.dp => FPv5-d16
- option dsp add armv7em
  option pacbti add pacbti
+ option dsp add armv7em

Why is this needed?  It looks completely unnecessary.

+/* Automatically add -mbranch-protection=none for M-profile targets if
+   -mbranch-protection value isn't specified via the command line.  */
+#define MBRANCH_PROTECTION_SPECS                               \
+  "%{!mbranch-protection=*:%:canon_branch_protection(%{march=*:arch %*;" \
+  "mcpu=*:cpu %*;:})}"
+

This doesn't canonicalize the branch-protection option, it provides a default if none was specified. So if we really need this operation (see below) it should be renamed accordingly.

 MULTI_ARCH_OPTS_RM     += mbranch-protection=standard
-MULTI_ARCH_DIRS_RM     += mbranch-protection
+MULTI_ARCH_DIRS_RM     += branch_protection_on
+MULTI_ARCH_OPTS_RM     += mbranch-protection=none
+MULTI_ARCH_DIRS_RM     += branch_protection_off

These options are related (you'll never need both), so it should be written as

 MULTI_ARCH_OPTS_RM     += mbranch-protection=standard/mbranch-protection=none
and then add
MULTI_ARCH_DIRS_RM      += mbranch_protection_on mbranch_protection_off

as a single line. But I think it would be better to rename the directory names as "bp" and "bp_off".

Except that...

Why do we need a separate bp_off multilib at all? That's the default and the multilib framework can be told how to handle that ...

Firstly, create a new header, lets call it arm-mlib.h, containing

#define MULTILIB_DEFAULTS { "mbranch-protection=none" }

And then arrange to add this new header when the multilib framework is enabled via config.gcc. You'll need to add this to ${tm_file} when we add the extra multilibs (search for "aprofile|rmprofile" in config.gcc).

Now you no longer need to handle this case at all in the multilib framework, since the compiler now knows that this is equivalent to omitting the option entirely. That should eliminate a lot of the code you're adding, along with the canonicalization step.

Secondly, you appear to be missing support for the other variants of -mbranch-protection. The manual says that we have none, standard, pac-ret, standard+leaf and pac-ret+leaf and we need MULTILIB_MATCHES rules to reuse the standard variant for these cases.

Finally, please make sure this is tested and works as expected when you have both a-profile and rm-profile multilibs in the same build.

R.

Reply via email to