Hi Richard,

I have all addressed all your review comments in the trailing in the patch 
attached.

Please review and let me know if it ok for master?

Regards,
Srinath.  
> -----Original Message-----
> From: Richard Earnshaw <richard.earns...@foss.arm.com>
> Sent: 02 June 2021 15:20
> To: Srinath Parvathaneni <srinath.parvathan...@arm.com>; gcc-
> patc...@gcc.gnu.org
> Cc: Richard Earnshaw <richard.earns...@arm.com>
> Subject: Re: [GCC][PATCH] arm: Fix multilib mapping for CDE extensions.
> 
> 
> 
> On 01/06/2021 18:08, Srinath Parvathaneni via Gcc-patches wrote:
> > Hi All,
> >
> > On passing +cdecp[0-7] extension to the -march string in command line
> > options, multilib linking is failing as mentioned in PR100856. This
> > patch fixes this issue by generating a separate -march string only for
> multilib comparison.
> >
> > Regression tested on arm-none-eabi and found no regressions.
> >
> > Ok for master?
> >
> Not as it stands.  More comments below.
> 
> > Regards,
> > Srinath.
> >
> > gcc/ChangeLog:
> >
> > 2021-06-01  Srinath Parvathaneni  <srinath.parvathan...@arm.com>
> >
> >     PR target/100856
> >     * common/config/arm/arm-common.c (arm_canon_arch_option):
> Modify
> >     function to generate canonical march string after removing cde
> related
> >     compiler extensions.
> >     (arm_canon_arch_multilib_option): Define function.
> >     * config/arm/arm-cpus.in (CDE_LIST): Define fgroup.
> >     * config/arm/arm.h (arm_canon_arch_multilib_option): Define
> macro.
> >     (CANON_ARCH_MULTILIB_SPEC_FUNCTION): Define macro.
> >     (ARCH_CANONICAL_MULTILIB_SPECS): Define macro.
> >     (TARGET_MULTLILIB_ARCH): Define macro.
> >     * gcc.c (used_arg_t::operator ()): Add condition to generate separate
> >     march string for multilib matching.
> >
> > gcc/testsuite/ChangeLog:
> >
> > 2021-06-01  Srinath Parvathaneni  <srinath.parvathan...@arm.com>
> >
> >     PR target/100856
> >     * gcc.target/arm/acle/pr100856.c: New test.
> >     * gcc.target/arm/multilib.exp: Modify.
> >
> >
> >
> > ###############     Attachment also inlined for ease of reply
> ###############
> >
> >
> > diff --git a/gcc/common/config/arm/arm-common.c
> > b/gcc/common/config/arm/arm-common.c
> > index
> >
> 9980af6885c3dfe68f61fa0f39b23022b4e59c19..7d8c6e5253f3f1683eed99f479
> a0
> > 9186a46c2d22 100644
> > --- a/gcc/common/config/arm/arm-common.c
> > +++ b/gcc/common/config/arm/arm-common.c
> > @@ -616,6 +616,8 @@ public:
> >       }
> >   };
> >
> > +static int multilib_arch = 0;
> 
> Please, no!  Instead...
> 
> > +
> >   /* Generate a canonical representation of the -march option from the
> >      current -march string (if given) and other options on the command
> >      line that might affect the architecture.  This aids multilib
> > selection @@ -703,6 +705,14 @@ arm_canon_arch_option (int argc, const
> > char **argv)
> 
> This function should be renamed arm_canon_arch_option_1 and given an
> extra (bool) parameter to control the behaviour.  Then
> arm_canon_arch_option can call it with the parameter false to maintain the
> existing behaviour and arm_canon_arch_multilib_option can pass true.
> 
> >         arm_initialize_isa (target_isa, selected_arch->common.isa_bits);
> >         arm_parse_option_features (target_isa, &selected_arch->common,
> >                              strchr (arch, '+'));
> > +      if (multilib_arch == 1)
> > +   {
> > +     const enum isa_feature cde_bitlist[] = {ISA_ALL_CDE, isa_nobit};
> 
> This is too specific, but that's mostly a naming problem.  Instead we need a
> new feature group IGNORE_FOR_MULTILIB (which at present just contains
> ALL_CDE).
> 
> > +     sbitmap isa_cdebits = sbitmap_alloc (isa_num_bits);
> > +     arm_initialize_isa (isa_cdebits, cde_bitlist);
> > +     bitmap_and_compl (target_isa, target_isa, isa_cdebits);
> > +   }
> > +
> >         if (fpu && strcmp (fpu, "auto") != 0)
> >     {
> >       /* We assume that architectures do not have any FPU bits @@
> > -786,18 +796,27 @@ arm_canon_arch_option (int argc, const char **argv)
> >
> >     arm_initialize_isa (base_isa, selected_arch->common.isa_bits);
> >
> > -  /* Architecture has no extension options, so just return the canonical
> > -     architecture name.  */
> > -  if (selected_arch->common.extensions == NULL)
> > -    return selected_arch->common.name;
> > -
> >     /* We're only interested in extension bits.  */
> >     bitmap_and_compl (target_isa, target_isa, base_isa);
> >
> > +  /* Architecture has no extension options, so just return the canonical
> > +     architecture name.  */
> > +  if (multilib_arch == 0 && selected_arch->common.extensions == NULL)
> > +    return selected_arch->common.name;
> >     /* There are no extensions needed.  Just return the canonical
> architecture
> >        name.  */
> > -  if (bitmap_empty_p (target_isa))
> > +  else if (multilib_arch == 0 && bitmap_empty_p (target_isa))
> >       return selected_arch->common.name;
> > +  else if (multilib_arch == 1
> > +      && (selected_arch->common.extensions == NULL
> > +          || bitmap_empty_p (target_isa)))
> > +    {
> > +      canonical_arch = (char *) xmalloc (strlen (selected_arch-
> >common.name)
> > +                                    + strlen ("march="));
> > +      strcpy (canonical_arch, "march=");
> 
> Prepending "march=" only for the multilib_arch variant confuses the purpose
> of this routine, which is to generate a suitable arch string.  I think this 
> should
> be pushed up, perhaps as far as the specs strings themselves.  Then most of
> this hunk just disappears as completely redundant.
> 
> > +      strcat (canonical_arch, selected_arch->common.name);
> > +      return canonical_arch;
> > +    }
> >
> >     /* What is left is the architecture that the compiler will target.  We
> >        now need to map that back into a suitable option+features list.
> > @@ -899,10 +918,20 @@ arm_canon_arch_option (int argc, const char
> **argv)
> >     }
> >       }
> >
> > -  canonical_arch
> > -    = (char *) xmalloc (len + strlen (selected_arch->common.name));
> > -
> > -  strcpy (canonical_arch, selected_arch->common.name);
> > +  if (multilib_arch == 1)
> > +    {
> > +      canonical_arch
> > +   = (char *) xmalloc (len + strlen (selected_arch->common.name)
> > +                       + strlen ("march="));
> > +      strcpy (canonical_arch, "march=");
> > +      strcat (canonical_arch, selected_arch->common.name);
> > +    }
> > +  else
> > +    {
> > +      canonical_arch
> > +   = (char *) xmalloc (len + strlen (selected_arch->common.name));
> > +      strcpy (canonical_arch, selected_arch->common.name);
> > +    }
> 
> Likewise.
> 
> >
> >     for (std::list<candidate_extension *>::iterator iter = extensions.begin 
> > ();
> >          iter != extensions.end (); ++iter) @@ -1069,3 +1098,15 @@
> > arm_asm_auto_mfpu (int argc, const char **argv)
> >   #define TARGET_EXCEPT_UNWIND_INFO  arm_except_unwind_info
> >
> >   struct gcc_targetm_common targetm_common =
> > TARGETM_COMMON_INITIALIZER;
> > +
> > +/* This function returns the canonical -march string after removing the
> compiler
> > +   extension options which are not required for multilib linking.  */
> > +const char * arm_canon_arch_multilib_option (int argc, const char
> > +**argv) {
> > +  char const *multilib_option = NULL;
> > +  multilib_arch = 1;
> > +  multilib_option = arm_canon_arch_option ( argc, argv);
> 
> remove white space before argc.
> 
> > +  multilib_arch = 0;
> 
> See comment earlier.  This function should just be
> 
> const char *
> arm_canon_arch_multilib_option (int argc, const char **argv) {
>    return arm_canon_arch_option_1 (argc, argv, true); }
> 
> > +  return multilib_option;
> > +}
> > diff --git a/gcc/config/arm/arm-cpus.in b/gcc/config/arm/arm-cpus.in
> > index
> >
> 0becb4385b675d0e08ea08c97785cabfa8cf7026..00944f8e9071d6097f703843f
> ee8
> > 822d0ee08d6a 100644
> > --- a/gcc/config/arm/arm-cpus.in
> > +++ b/gcc/config/arm/arm-cpus.in
> > @@ -324,6 +324,8 @@ define implied vfp_base MVE MVE_FP ALL_FP
> >   # need to ignore it for matching purposes.
> >   define fgroup ALL_QUIRKS   quirk_no_volatile_ce quirk_armv6kz
> quirk_cm3_ldrd xscale quirk_no_asmcpu
> >
> > +define fgroup ALL_CDE cdecp0 cdecp1 cdecp2 cdecp3 cdecp4 cdecp5
> > +cdecp6 cdecp7
> > +
> >   # Architecture entries
> >   # format:
> >   # begin arch <name>
> > diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index
> >
> 8e5bd5793237e531aa83d998f5756b459dbcb6a7..0859c2dc1d60b98935242fc
> e56b1
> > 7f5f67fd1509 100644
> > --- a/gcc/config/arm/arm.h
> > +++ b/gcc/config/arm/arm.h
> > @@ -2444,10 +2444,14 @@ extern const char *host_detect_local_cpu (int
> argc, const char **argv);
> >   #endif
> >
> >   const char *arm_canon_arch_option (int argc, const char **argv);
> > +const char *arm_canon_arch_multilib_option (int argc, const char
> > +**argv);
> >
> >   #define CANON_ARCH_SPEC_FUNCTION          \
> >     { "canon_arch", arm_canon_arch_option },
> >
> > +#define CANON_ARCH_MULTILIB_SPEC_FUNCTION          \
> > +  { "canon_arch_multilib", arm_canon_arch_multilib_option },
> > +
> >   const char *arm_be8_option (int argc, const char **argv);
> >   #define BE8_SPEC_FUNCTION                 \
> >     { "be8_linkopt", arm_be8_option }, @@ -2456,6 +2460,7 @@ const
> > char *arm_be8_option (int argc, const char **argv);
> >     MCPU_MTUNE_NATIVE_FUNCTIONS                     \
> >     ASM_CPU_SPEC_FUNCTIONS                  \
> >     CANON_ARCH_SPEC_FUNCTION                        \
> > +  CANON_ARCH_MULTILIB_SPEC_FUNCTION                \
> >     TARGET_MODE_SPEC_FUNCTIONS                      \
> >     BE8_SPEC_FUNCTION
> >
> > @@ -2476,6 +2481,15 @@ const char *arm_be8_option (int argc, const
> char **argv);
> >     "                     %{mfloat-abi=*: abi %*}"  \
> >     "                     %<march=*) "
> >
> > +/* Generate a canonical string without compiler extension which are not
> needed
> > +   for multilib linking.  */
> > +#define ARCH_CANONICAL_MULTILIB_SPECS      \
> > +  "%{mcpu=*: cpu %*} "                     \
> > +  "%{march=*: arch %*} "           \
> > +  "%{mfpu=*: fpu %*} "                     \
> > +  "%{mfloat-abi=*: abi %*}"                \
> > +  "%<march=*) "
> > +
> >   /* Complete set of specs for the driver.  Commas separate the
> >      individual rules so that any option suppression (%<opt...)is
> >      completed before starting subsequent rules.  */ @@ -2484,6
> > +2498,8 @@ const char *arm_be8_option (int argc, const char **argv);
> >     TARGET_MODE_SPECS,                              \
> >     ARCH_CANONICAL_SPECS
> >
> > +#define TARGET_MULTLILIB_ARCH 1
> > +
> 
> This isn't documented.  But it's no-longer the way we do things anyway.
>   What's needed these days is a hook.
> 
> >   #define TARGET_SUPPORTS_WIDE_INT 1
> >
> >   /* For switching between functions with different target attributes.
> > */ diff --git a/gcc/gcc.c b/gcc/gcc.c index
> >
> 4c1a659d5e8929ed2267694c0d62ce476a099bf5..7984806f5fe0e65021daffaa
> 0557
> > 93890db23228 100644
> > --- a/gcc/gcc.c
> > +++ b/gcc/gcc.c
> > @@ -9414,9 +9414,27 @@ used_arg_t::operator () (const char *p, int len)
> >     if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
> >       {
> >         int xlen = strlen (switches[i].part1);
> > +#ifdef TARGET_MULTLILIB_ARCH
> > +       const char *arch_multilib = NULL;
> > +       if (!strncmp (switches[i].part1, "march=", strlen ("march=")))
> > +         {
> > +           arch_multilib
> > +             = eval_spec_function ("canon_arch_multilib",
> > +                                   ARCH_CANONICAL_MULTILIB_SPECS,
> NULL);
> > +           xlen = strlen (arch_multilib);
> > +         }
> > +       for (j = 0; j < cnt; j++)
> > +         if (xlen == matches[j].len
> > +             && ((arch_multilib != NULL
> > +                  && !strncmp (arch_multilib, matches[j].str, xlen))
> > +                 || (arch_multilib == NULL
> > +                     && !strncmp (switches[i].part1, matches[j].str,
> > +                                  xlen))))
> > +#else
> 
> This just won't fly.  Firstly, we don't use ifdefs this way in the main code 
> base
> anymore (it needs to be done through hooks if it can't be made completely
> generic).  Secondly, it makes reference to a machine-specific switch name
> directly from machine-independent code.  I don't currently have a strong
> suggestion to make at this point, though, sorry.  Perhaps someone else can
> suggest a way forward.
> 
> >         for (j = 0; j < cnt; j++)
> >           if (xlen == matches[j].len
> >               && ! strncmp (switches[i].part1, matches[j].str, xlen))
> > +#endif
> >             {
> >               mswitches[n_mswitches].str = matches[j].replace;
> >               mswitches[n_mswitches].len = matches[j].rep_len; @@ -
> 9425,6
> > +9443,10 @@ used_arg_t::operator () (const char *p, int len)
> >               n_mswitches++;
> >               break;
> >             }
> > +#ifdef TARGET_MULTLILIB_ARCH
> > +       if (arch_multilib != NULL)
> > +         free (CONST_CAST (char *, arch_multilib)); #endif
> >       }
> >
> >         /* Add MULTILIB_DEFAULTS switches too, as long as they were
> > not present diff --git a/gcc/testsuite/gcc.target/arm/acle/pr100856.c
> > b/gcc/testsuite/gcc.target/arm/acle/pr100856.c
> > new file mode 100644
> > index
> >
> 0000000000000000000000000000000000000000..5bc030e2e46bf89dfe7f3b9
> d0dab
> > 1e07947e8d5e
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/arm/acle/pr100856.c
> > @@ -0,0 +1,10 @@
> > +/* { dg-do run } */
> > +/* { dg-require-effective-target arm_v8_1m_main_cde_mve_ok } */
> > +/* { dg-add-options arm_v8_1m_main_cde_mve } */
> > +
> > +#include "arm_cde.h"
> > +
> > +int main()
> > +{
> > +  return 0;
> > +}
> > diff --git a/gcc/testsuite/gcc.target/arm/multilib.exp
> > b/gcc/testsuite/gcc.target/arm/multilib.exp
> > index
> >
> 46f2d86de3c05c184b2ec12af53e2053ddc3b157..4b30025db8cbdcd37bbb3a0
> be6c3
> > 45b9d48818c4 100644
> > --- a/gcc/testsuite/gcc.target/arm/multilib.exp
> > +++ b/gcc/testsuite/gcc.target/arm/multilib.exp
> > @@ -840,6 +840,119 @@ if {[multilib_config "rmprofile"] } {
> >     {-mcpu=cortex-m55+nomve+nofp -mfpu=auto -mfloat-abi=softfp}
> "thumb/v8-m.main/nofp"
> >     {-mcpu=cortex-m55+nodsp+nofp -mfpu=auto -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> >     {-mcpu=cortex-m55+nodsp+nofp -mfpu=auto -mfloat-abi=softfp}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=auto -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=auto -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=auto -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=auto -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -
> mfloat-abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -
> mfloat-abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -
> mfloat-abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -
> mfloat-abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=auto -mfloat-abi=hard}
> "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=hard}
> "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=auto -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=auto -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd -mfloat-abi=hard}
> "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=hard}
> "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -
> mfloat-abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -
> mfloat-abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -
> mfloat-abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -
> mfloat-abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=hard}
> "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=auto -mfloat-abi=softfp}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=auto -mfloat-abi=softfp}
> "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=auto -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=auto -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=auto -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd -mfloat-abi=softfp}
> "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -
> mfloat-abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -
> mfloat-abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -
> mfloat-abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -
> mfloat-abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=softfp}
> "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8.1-m.main+cdecp0 -mfpu=auto -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+dsp+cdecp0 -mfpu=auto -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+dsp+fp+cdecp0 -mfpu=auto -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+dsp+fp.dp+cdecp0 -mfpu=auto -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+cdecp0 -mfpu=auto -mfloat-abi=softfp}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+dsp+cdecp0 -mfpu=auto -mfloat-
> abi=softfp} "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+dsp+fp+cdecp0 -mfpu=auto -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8.1-m.main+dsp+fp.dp+cdecp0 -mfpu=auto -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8.1-m.main+dsp+fp+cdecp0 -mfpu=auto -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8.1-m.main+dsp+fp.dp+cdecp0 -mfpu=auto -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8.1-m.main+mve+cdecp0 -mfpu=auto -mfloat-abi=soft}
> "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+mve.fp+cdecp0 -mfpu=auto -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+mve+cdecp0 -mfpu=auto -mfloat-
> abi=softfp} "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+mve.fp+cdecp0 -mfpu=auto -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8.1-m.main+mve+cdecp0 -mfpu=auto -mfloat-
> abi=hard} "thumb/v8.1-m.main+mve/hard"
> > +   {-march=armv8.1-m.main+mve+fp+cdecp0 -mfpu=auto -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8.1-m.main+mve+fp+cdecp0 -mfpu=auto -mfloat-
> abi=softfp} "thumb/v8-m.main+fp/softfp"
> > +   {-march=armv8.1-m.main+mve.fp+cdecp0 -mfpu=auto -mfloat-
> abi=hard} "thumb/v8-m.main+fp/hard"
> > +   {-march=armv8.1-m.main+mve+fp.dp+cdecp0 -mfpu=auto -mfloat-
> abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+mve.fp+fp.dp+cdecp0 -mfpu=auto -
> mfloat-abi=soft} "thumb/v8-m.main/nofp"
> > +   {-march=armv8.1-m.main+mve+fp.dp+cdecp0 -mfpu=auto -mfloat-
> abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8.1-m.main+mve.fp+fp.dp+cdecp0 -mfpu=auto -
> mfloat-abi=softfp} "thumb/v8-m.main+dp/softfp"
> > +   {-march=armv8.1-m.main+mve+fp.dp+cdecp0 -mfpu=auto -mfloat-
> abi=hard} "thumb/v8-m.main+dp/hard"
> > +   {-march=armv8.1-m.main+mve.fp+fp.dp+cdecp0 -mfpu=auto -
> mfloat-abi=hard} "thumb/v8-m.main+dp/hard"
> >       } {
> >     check_multi_dir $opts $dir
> >       }
> >

Attachment: code_diff
Description: code_diff

Hi All,

On passing +cdecp[0-7] extension to the -march string in command line options,
multilib linking is failing as mentioned in PR100856. This patch fixes this 
issue by
generating a separate canonical string by removing compiler options which are 
not
required for multilib linking from march string and assign the new string to 
mlibarch
option. This mlibarch string is used for multilib comparison.

Regression tested on arm-none-eabi and found no regressions.

Ok for master?

Regards,
Srinath.

gcc/ChangeLog:

2021-06-10  Srinath Parvathaneni  <srinath.parvathan...@arm.com>

        PR target/100856
        * common/config/arm/arm-common.c (arm_canon_arch_option): Define
        function to call arm_canon_arch_option_1 with flase boolean argument to
        generate canonical string for march option.
        (arm_canon_arch_option_1): Rename arm_canon_arch_option to
        arm_canon_arch_option_1 and add a boolean argument.
        (arm_canon_arch_multilib_option): Define function to call
        arm_canon_arch_option_1 with true boolean argument to generate canonical
        string for mlibarch option.
        * config/arm/arm-cpus.in (IGNORE_FOR_MULTILIB): Define fgroup with cde
        feature bits.
        * config/arm/arm.h (arm_canon_arch_option_1): Function declaration.
        (arm_canon_arch_multilib_option): Function declaration.
        (CANON_ARCH_MULTILIB_SPEC_FUNCTION): Define new macro.
        (MULTILIB_ARCH_CANONICAL_SPECS): Define new macro.
        (DRIVER_SELF_SPECS): Add MULTILIB_ARCH_CANONICAL_SPECS entry.
        * config/arm/arm.opt (mlibarch): Add new option which is supported by
        DriverOnly.
        * config/arm/t-rmprofile (MULTILIB_MATCHES): march on right hand side of
        equal to is replaced with mlibarch for multilib comparison.

gcc/testsuite/ChangeLog:

2021-06-10  Srinath Parvathaneni  <srinath.parvathan...@arm.com>

        PR target/100856
        * gcc.target/arm/acle/pr100856.c: New test.
        * gcc.target/arm/multilib.exp: Add cde compiler option entries.

Reply via email to