public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [GCC][PATCH] arm: Fix multilib mapping for CDE extensions.
@ 2021-06-01 17:08 Srinath Parvathaneni
  2021-06-02 14:20 ` Richard Earnshaw
  0 siblings, 1 reply; 3+ messages in thread
From: Srinath Parvathaneni @ 2021-06-01 17:08 UTC (permalink / raw)
  To: gcc-patches; +Cc: Kyrylo.Tkachov, Richard.Earnshaw

[-- Attachment #1: Type: text/plain, Size: 21220 bytes --]

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?

Regards,
Srinath.

gcc/ChangeLog:

2021-06-01  Srinath Parvathaneni  <srinath.parvathaneni@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.parvathaneni@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..7d8c6e5253f3f1683eed99f479a09186a46c2d22 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;
+
 /* 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)
       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};
+	  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=");
+      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);
+    }
 
   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);
+  multilib_arch = 0;
+  return multilib_option;
+}
diff --git a/gcc/config/arm/arm-cpus.in b/gcc/config/arm/arm-cpus.in
index 0becb4385b675d0e08ea08c97785cabfa8cf7026..00944f8e9071d6097f703843fee8822d0ee08d6a 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..0859c2dc1d60b98935242fce56b17f5f67fd1509 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
+
 #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..7984806f5fe0e65021daffaa055793890db23228 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
 	    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..5bc030e2e46bf89dfe7f3b9d0dab1e07947e8d5e
--- /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..4b30025db8cbdcd37bbb3a0be6c345b9d48818c4 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 #2: rb14509.patch --]
[-- Type: text/plain, Size: 19920 bytes --]

diff --git a/gcc/common/config/arm/arm-common.c b/gcc/common/config/arm/arm-common.c
index 9980af6885c3dfe68f61fa0f39b23022b4e59c19..7d8c6e5253f3f1683eed99f479a09186a46c2d22 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;
+
 /* 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)
       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};
+	  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=");
+      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);
+    }
 
   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);
+  multilib_arch = 0;
+  return multilib_option;
+}
diff --git a/gcc/config/arm/arm-cpus.in b/gcc/config/arm/arm-cpus.in
index 0becb4385b675d0e08ea08c97785cabfa8cf7026..00944f8e9071d6097f703843fee8822d0ee08d6a 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..0859c2dc1d60b98935242fce56b17f5f67fd1509 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
+
 #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..7984806f5fe0e65021daffaa055793890db23228 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
 	    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..5bc030e2e46bf89dfe7f3b9d0dab1e07947e8d5e
--- /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..4b30025db8cbdcd37bbb3a0be6c345b9d48818c4 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
     }


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [GCC][PATCH] arm: Fix multilib mapping for CDE extensions.
  2021-06-01 17:08 [GCC][PATCH] arm: Fix multilib mapping for CDE extensions Srinath Parvathaneni
@ 2021-06-02 14:20 ` Richard Earnshaw
  2021-06-10 16:33   ` Srinath Parvathaneni
  0 siblings, 1 reply; 3+ messages in thread
From: Richard Earnshaw @ 2021-06-02 14:20 UTC (permalink / raw)
  To: Srinath Parvathaneni, gcc-patches; +Cc: Richard.Earnshaw



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.parvathaneni@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.parvathaneni@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..7d8c6e5253f3f1683eed99f479a09186a46c2d22 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..00944f8e9071d6097f703843fee8822d0ee08d6a 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..0859c2dc1d60b98935242fce56b17f5f67fd1509 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..7984806f5fe0e65021daffaa055793890db23228 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..5bc030e2e46bf89dfe7f3b9d0dab1e07947e8d5e
> --- /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..4b30025db8cbdcd37bbb3a0be6c345b9d48818c4 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
>       }
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [GCC][PATCH] arm: Fix multilib mapping for CDE extensions.
  2021-06-02 14:20 ` Richard Earnshaw
@ 2021-06-10 16:33   ` Srinath Parvathaneni
  0 siblings, 0 replies; 3+ messages in thread
From: Srinath Parvathaneni @ 2021-06-10 16:33 UTC (permalink / raw)
  To: Richard Earnshaw, gcc-patches; +Cc: Richard Earnshaw, Kyrill Tkachov

[-- Attachment #1: Type: text/plain, Size: 26082 bytes --]

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.Earnshaw@foss.arm.com>
> Sent: 02 June 2021 15:20
> To: Srinath Parvathaneni <Srinath.Parvathaneni@arm.com>; gcc-
> patches@gcc.gnu.org
> Cc: Richard Earnshaw <Richard.Earnshaw@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.parvathaneni@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.parvathaneni@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 #2: code_diff --]
[-- Type: application/octet-stream, Size: 20832 bytes --]

diff --git a/gcc/common/config/arm/arm-common.c b/gcc/common/config/arm/arm-common.c
index 9980af6885c3dfe68f61fa0f39b23022b4e59c19..13368ec07d170473057f6d4ac479a1c364bb4552 100644
--- a/gcc/common/config/arm/arm-common.c
+++ b/gcc/common/config/arm/arm-common.c
@@ -629,7 +629,7 @@ public:
    name was selected (arch, cpu, fpu) and the second is the value
    passed for that option.  */
 const char *
-arm_canon_arch_option (int argc, const char **argv)
+arm_canon_arch_option_1 (int argc, const char **argv, bool flag)
 {
   const char *arch = NULL;
   const char *cpu = NULL;
@@ -676,7 +676,10 @@ arm_canon_arch_option (int argc, const char **argv)
 
   /* At least one of these must be defined by either the specs or the
      user.  */
-  gcc_assert (cpu || arch);
+  gcc_assert (cpu || arch || flag);
+
+  if (flag && !(cpu || arch))
+    return "";
 
   if (!fpu)
     fpu = FPUTYPE_AUTO;
@@ -695,7 +698,7 @@ arm_canon_arch_option (int argc, const char **argv)
   if (arch)
     {
       selected_arch = arm_parse_arch_option_name (all_architectures,
-						  "-march", arch);
+						  "-march", arch, !flag);
 
       if (selected_arch == NULL)
 	return "";
@@ -703,6 +706,15 @@ arm_canon_arch_option (int argc, const char **argv)
       arm_initialize_isa (target_isa, selected_arch->common.isa_bits);
       arm_parse_option_features (target_isa, &selected_arch->common,
 				 strchr (arch, '+'));
+      if (flag)
+	{
+	  const enum isa_feature removable_bits[] = {ISA_IGNORE_FOR_MULTILIB,
+						     isa_nobit};
+	  sbitmap isa_bits = sbitmap_alloc (isa_num_bits);
+	  arm_initialize_isa (isa_bits, removable_bits);
+	  bitmap_and_compl (target_isa, target_isa, isa_bits);
+	}
+
       if (fpu && strcmp (fpu, "auto") != 0)
 	{
 	  /* We assume that architectures do not have any FPU bits
@@ -719,7 +731,7 @@ arm_canon_arch_option (int argc, const char **argv)
   else if (cpu)
     {
       const cpu_option *selected_cpu
-	= arm_parse_cpu_option_name (all_cores, "-mcpu", cpu);
+	= arm_parse_cpu_option_name (all_cores, "-mcpu", cpu, !flag);
 
       if (selected_cpu == NULL)
 	return "";
@@ -1069,3 +1081,17 @@ 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;
+
+const char *
+arm_canon_arch_option (int argc, const char **argv)
+{
+  return arm_canon_arch_option_1 (argc, argv, false);
+}
+
+/* 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)
+{
+  return arm_canon_arch_option_1 (argc, argv, true);
+}
diff --git a/gcc/config/arm/arm-cpus.in b/gcc/config/arm/arm-cpus.in
index 0becb4385b675d0e08ea08c97785cabfa8cf7026..ab4b6acf5ea47b1c788dea8f7878141f2a4018cc 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 IGNORE_FOR_MULTILIB 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..d217ae1db3c25d66ad6215e07e2b300416b04d9a 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -53,6 +53,10 @@ extern char arm_arch_name[];
 
 #include "config/arm/arm-opts.h"
 
+#ifndef  __cplusplus
+#include <stdbool.h>
+#endif
+
 /* The processor for which instructions should be scheduled.  */
 extern enum processor_type arm_tune;
 
@@ -2444,10 +2448,15 @@ 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_option_1 (int argc, const char **argv, bool flag);
+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 +2465,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,13 +2486,23 @@ const char *arm_be8_option (int argc, const char **argv);
   "                     %{mfloat-abi=*: abi %*}"	\
   "                     %<march=*) "
 
+/* Generate a canonical string to represent the architecture selected ignoring
+   the options not required for multilib linking.  */
+#define MULTILIB_ARCH_CANONICAL_SPECS				\
+  "-mlibarch=%:canon_arch_multilib(%{mcpu=*: cpu %*} "		\
+  "				   %{march=*: arch %*} "	\
+  "				   %{mfpu=*: fpu %*} "		\
+  "				   %{mfloat-abi=*: abi %*}"	\
+  "				   %<mlibarch=*) "
+
 /* Complete set of specs for the driver.  Commas separate the
    individual rules so that any option suppression (%<opt...)is
    completed before starting subsequent rules.  */
 #define DRIVER_SELF_SPECS			\
   MCPU_MTUNE_NATIVE_SPECS,			\
   TARGET_MODE_SPECS,				\
-  ARCH_CANONICAL_SPECS
+  ARCH_CANONICAL_SPECS,				\
+  MULTILIB_ARCH_CANONICAL_SPECS
 
 #define TARGET_SUPPORTS_WIDE_INT 1
 
diff --git a/gcc/config/arm/arm.opt b/gcc/config/arm/arm.opt
index d332eb67a9efdfcdc9484485ae6293038b626efc..1d633bc51ce0974045b825c9222e716f8483bd8d 100644
--- a/gcc/config/arm/arm.opt
+++ b/gcc/config/arm/arm.opt
@@ -81,6 +81,12 @@ Specify the name of the target architecture.
 EnumValue
 Enum(arm_arch) String(native) Value(-1) DriverOnly
 
+mlibarch=
+Target RejectNegative JoinedOrMissing Undocumented
+
+EnumValue
+Enum(arm_arch) String(native) Value(-1) DriverOnly
+
 marm
 Target RejectNegative Negative(mthumb) InverseMask(THUMB)
 Generate code in 32 bit ARM state.
diff --git a/gcc/config/arm/t-rmprofile b/gcc/config/arm/t-rmprofile
index 19591892f3caae87c7aa00ce2a7ecd0e072aedc5..11edf5a3e934afc3069795c6596a36306ef2137f 100644
--- a/gcc/config/arm/t-rmprofile
+++ b/gcc/config/arm/t-rmprofile
@@ -51,24 +51,23 @@ MULTILIB_REQUIRED	+= mthumb/march=armv8-m.main+fp.dp/mfloat-abi=softfp
 MULTILIB_REQUIRED	+= mthumb/march=armv8.1-m.main+mve/mfloat-abi=hard
 
 # Arch Matches
-MULTILIB_MATCHES	+= march?armv6s-m=march?armv6-m
+MULTILIB_MATCHES	+= march?armv6s-m=mlibarch?armv6-m
 
 # Map all v8-m.main+dsp FP variants down to the variant without DSP.
-MULTILIB_MATCHES	+= march?armv8-m.main=march?armv8-m.main+dsp \
+MULTILIB_MATCHES	+= march?armv8-m.main=mlibarch?armv8-m.main+dsp \
 			   $(foreach FP, +fp +fp.dp, \
-			     march?armv8-m.main$(FP)=march?armv8-m.main+dsp$(FP))
+			     march?armv8-m.main$(FP)=mlibarch?armv8-m.main+dsp$(FP))
 
 # For single-precision only fpv5, use the base fp libraries
-MULTILIB_MATCHES	+= march?armv7e-m+fp=march?armv7e-m+fpv5
+MULTILIB_MATCHES	+= march?armv7e-m+fp=mlibarch?armv7e-m+fpv5
 
 # Softfp but no FP.  Use the soft-float libraries.
 MULTILIB_REUSE		+= $(foreach ARCH, armv6s-m armv7-m armv7e-m armv8-m\.base armv8-m\.main, \
 			     mthumb/march.$(ARCH)/mfloat-abi.soft=mthumb/march.$(ARCH)/mfloat-abi.softfp)
 
-
 # Map v8.1-M to v8-M.
-MULTILIB_MATCHES	+= march?armv8-m.main=march?armv8.1-m.main
-MULTILIB_MATCHES	+= march?armv8-m.main=march?armv8.1-m.main+dsp
+MULTILIB_MATCHES	+= march?armv8-m.main=mlibarch?armv8.1-m.main
+MULTILIB_MATCHES	+= march?armv8-m.main=mlibarch?armv8.1-m.main+dsp
 MULTILIB_REUSE		+= mthumb/march.armv8-m\.main/mfloat-abi.soft=mthumb/march.armv8\.1-m\.main+mve/mfloat-abi.soft
 MULTILIB_REUSE		+= mthumb/march.armv8-m\.main/mfloat-abi.soft=mthumb/march.armv8\.1-m\.main+mve/mfloat-abi.softfp
 
@@ -77,8 +76,14 @@ v8_1m_dp_variants = +fp.dp +dsp+fp.dp +fp.dp+mve +fp.dp+mve.fp
 
 # Map all v8.1-m.main FP sp variants down to v8-m.
 MULTILIB_MATCHES += $(foreach FP, $(v8_1m_sp_variants), \
-			     march?armv8-m.main+fp=march?armv8.1-m.main$(FP))
+			     march?armv8-m.main+fp=mlibarch?armv8.1-m.main$(FP))
 
 # Map all v8.1-m.main FP dp variants down to v8-m.
 MULTILIB_MATCHES += $(foreach FP, $(v8_1m_dp_variants), \
-			     march?armv8-m.main+fp.dp=march?armv8.1-m.main$(FP))
+			     march?armv8-m.main+fp.dp=mlibarch?armv8.1-m.main$(FP))
+
+# Match multilib_required variants starting with mlibarch with alias march.
+MULTILIB_MATCHES	+= march?armv8-m.main=mlibarch?armv8-m.main
+MULTILIB_MATCHES	+= march?armv8-m.main+fp=mlibarch?armv8-m.main+fp
+MULTILIB_MATCHES	+= march?armv8-m.main+fp.dp=mlibarch?armv8-m.main+fp.dp
+MULTILIB_MATCHES	+= march?armv8.1-m.main+mve=mlibarch?armv8.1-m.main+mve
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..5bc030e2e46bf89dfe7f3b9d0dab1e07947e8d5e
--- /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..4b30025db8cbdcd37bbb3a0be6c345b9d48818c4 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 #3: changelog (2).txt --]
[-- Type: text/plain, Size: 1883 bytes --]

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.parvathaneni@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.parvathaneni@arm.com>

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

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-06-10 16:34 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-01 17:08 [GCC][PATCH] arm: Fix multilib mapping for CDE extensions Srinath Parvathaneni
2021-06-02 14:20 ` Richard Earnshaw
2021-06-10 16:33   ` Srinath Parvathaneni

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).