diff mbox

MULTILIB_DEFAULTS needs an update for ARM multilib builds

Message ID 4FA14BDC.8030102@ubuntu.com
State New
Headers show

Commit Message

Matthias Klose May 2, 2012, 2:59 p.m. UTC
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.

  Matthias

Comments

Richard Earnshaw May 2, 2012, 3:02 p.m. UTC | #1
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?

R.
diff mbox

Patch

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.  */
@@ -78,6 +92,28 @@ 
     %{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