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