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 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 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::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 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 %*}" \ " %