On 02.05.2012 17:02, Richard Earnshaw wrote: > On 02/05/12 15:59, Matthias Klose wrote: >> On 02.05.2012 16:53, Richard Earnshaw wrote: >>> On 02/05/12 14:26, Matthias Klose wrote: >>>> I did see gcc-4.7 fail to build for an ARM soft-float/hard-float multilib >>>> configuration. The reason is that gcc -print-multi-directory doesn't print >>>> anything for the non-default, and gcc -print-multi-lib only prints `.' >>>> (and then >>>> not building the runtime libs for the non-default). The reason is that >>>> set_multilib_dir in gcc.c only consults MULTILIB_DEFAULTS (only defined in >>>> linux-elf.h), but not configure_default_options in configargs.h. This >>>> proposed >>>> patch updates MULTILIB_DEFAULTS depending on the configure options. An >>>> alternative approach would be to update set_multilib_dir and >>>> print_multilib_info >>>> to lookup configure_default_options in configargs.h as well. >>>> >>>> Note that this didn't fail to build in gcc-4.6, but I can't see yet what >>>> change >>>> did cause the build failure. >>>> >>>> I didn't check if other targets need an update as well. >>>> >>>> Ok for the trunk? >>>> >>>> Matthias >>>> >>> >>> This patch doesn't appear to be based of FSF trunk... >>> >>> >>>> @@ -68,6 +82,28 @@ >>>> "%{mfloat-abi=hard:" GLIBC_DYNAMIC_LINKER_HARD_FLOAT "} \ >>>> %{!mfloat-abi=hard:" GLIBC_DYNAMIC_LINKER_SOFT_FLOAT "}" >>>> >>> >>> This pre-amble code has never existed in the FSF build. >>> >>> >>> Please ensure you are testing patches against the FSF sources, not some >>> custom variant. >> >> it was, not only on "some custom variant". The second chunk applies with >> fuzz >> 2, and I didn't notice when submitting. >> > > So shouldn't the patch also update the setting of > GLIBC_DYNAMIC_LINKER_DEFAULT?
like this one?
Index: gcc/config.gcc =================================================================== --- gcc/config.gcc (revision 187013) +++ gcc/config.gcc (working copy) @@ -3013,10 +3013,18 @@ esac case "$with_float" in - "" \ - | soft | hard | softfp) + "") # OK ;; + soft) + tm_defines="${tm_defines} TARGET_CONFIGURED_FLOAT_ABI=0" + ;; + softfp) + tm_defines="${tm_defines} TARGET_CONFIGURED_FLOAT_ABI=1" + ;; + hard) + tm_defines="${tm_defines} TARGET_CONFIGURED_FLOAT_ABI=2" + ;; *) echo "Unknown floating point type used in --with-float=$with_float" 1>&2 exit 1 @@ -3060,6 +3068,9 @@ "" \ | arm | thumb ) #OK + if test "$with_mode" = thumb; then + tm_defines="${tm_defines} TARGET_CONFIGURED_THUMB_MODE=1" + fi ;; *) echo "Unknown mode used in --with-mode=$with_mode" Index: gcc/config/arm/linux-eabi.h =================================================================== --- gcc/config/arm/linux-eabi.h (revision 187013) +++ gcc/config/arm/linux-eabi.h (working copy) @@ -35,7 +35,21 @@ target hardware. If you override this to use the hard-float ABI then change the setting of GLIBC_DYNAMIC_LINKER_DEFAULT as well. */ #undef TARGET_DEFAULT_FLOAT_ABI +#ifdef TARGET_CONFIGURED_FLOAT_ABI +#if TARGET_CONFIGURED_FLOAT_ABI == 2 +#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD +#define MULTILIB_DEFAULT_FLOAT_ABI "mfloat-abi=hard" +#elif TARGET_CONFIGURED_FLOAT_ABI == 1 +#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFTFP +#define MULTILIB_DEFAULT_FLOAT_ABI "mfloat-abi=softfp" +#else #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT +#define MULTILIB_DEFAULT_FLOAT_ABI "mfloat-abi=soft" +#endif +#else +#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT +#define MULTILIB_DEFAULT_FLOAT_ABI "mfloat-abi=soft" +#endif /* We default to the "aapcs-linux" ABI so that enums are int-sized by default. */ @@ -71,13 +85,43 @@ #undef GLIBC_DYNAMIC_LINKER #define GLIBC_DYNAMIC_LINKER_SOFT_FLOAT "/lib/ld-linux.so.3" #define GLIBC_DYNAMIC_LINKER_HARD_FLOAT "/lib/ld-linux-armhf.so.3" +#ifdef TARGET_CONFIGURED_FLOAT_ABI +#if TARGET_CONFIGURED_FLOAT_ABI == 2 +#define GLIBC_DYNAMIC_LINKER_DEFAULT GLIBC_DYNAMIC_LINKER_HARD_FLOAT +#else #define GLIBC_DYNAMIC_LINKER_DEFAULT GLIBC_DYNAMIC_LINKER_SOFT_FLOAT +#endif +#else +#define GLIBC_DYNAMIC_LINKER_DEFAULT GLIBC_DYNAMIC_LINKER_SOFT_FLOAT +#endif #define GLIBC_DYNAMIC_LINKER \ "%{mfloat-abi=hard:" GLIBC_DYNAMIC_LINKER_HARD_FLOAT "} \ %{mfloat-abi=soft*:" GLIBC_DYNAMIC_LINKER_SOFT_FLOAT "} \ %{!mfloat-abi=*:" GLIBC_DYNAMIC_LINKER_DEFAULT "}" +/* Set the multilib defaults according the configuration, needed to + let gcc -print-multi-dir do the right thing. */ + +#if TARGET_BIG_ENDIAN_DEFAULT +#define MULTILIB_DEFAULT_ENDIAN "mbig-endian" +#else +#define MULTILIB_DEFAULT_ENDIAN "mlittle-endian" +#endif + +#ifndef TARGET_CONFIGURED_THUMB_MODE +#define MULTILIB_DEFAULT_MODE "marm" +#elif TARGET_CONFIGURED_THUMB_MODE == 1 +#define MULTILIB_DEFAULT_MODE "mthumb" +#else +#define MULTILIB_DEFAULT_MODE "marm" +#endif + +#undef MULTILIB_DEFAULTS +#define MULTILIB_DEFAULTS \ + { MULTILIB_DEFAULT_MODE, MULTILIB_DEFAULT_ENDIAN, \ + MULTILIB_DEFAULT_FLOAT_ABI, "mno-thumb-interwork" } + /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to use the GNU/Linux version, not the generic BPABI version. */ #undef LINK_SPEC