This patch corrects the powerpc64le-linux multiarch directory, adds opposite-endian multilibs, and chooses non-multiarch os dirs for the new multilibs.
For multiarch, powerpc64le-linux now will use powerpc64le-linux-gnu. Given a typical big-endian native toolchain with os dirs /lib and /lib64, we'll use /lible and /lib64le if supporting little-endian as well. If you happen to use /lib and /lib32, then the little-endian variants are /lible and /lib32le. For completeness I also support building big-endian multilibs on a little-endian host. All of this is done with a dose of "make" string manipulation functions guaranteed to make your eye glaze over, but there are just too many combinations of different configurations to simply enumerate them all. I use ':=' assignment for the multilib make variables because you can't have a recursively evaluated variable (ie. one assigned with '=') reference itself, as is done with MULTILIB_OSDIRNAMES, and we may as well use the same for all the multilib vars. I also remove fPIC from MULTILIB_EXTRA_OPTS because -fPIC is already added where necessary by the library Makefiles. Also, MULTILIB_EXTRA_OPTS is only for options that apply to the non-default multilibs. It isn't used for the default multilib, so this isn't the place to put options common to all multilibs. (I've been building gcc with this particular change for years.) Bootstrapped and regression tested powerpc64-linux. OK for mainline and 4.8? * config.gcc (powerpc*-*-linux*): Add support for little-endian multilibs to big-endian target and vice versa. * config/rs6000/t-linux64: Use := assignment on all vars. (MULTILIB_EXTRA_OPTS): Remove fPIC. (MULTILIB_OSDIRNAMES): Specify using mapping from multilib_options. * config/rs6000/t-linux64le: New file. * config/rs6000/t-linux64bele: New file. * config/rs6000/t-linux64lebe: New file. Index: gcc/config.gcc =================================================================== --- gcc/config.gcc (revision 201834) +++ gcc/config.gcc (working copy) @@ -2139,7 +2139,7 @@ tmake_file="rs6000/t-fprules rs6000/t-ppcos ${tmake_file} rs6000/t-ppccomm" case ${target} in powerpc*le-*-*) - tm_file="${tm_file} rs6000/sysv4le.h" ;; + tm_file="${tm_file} rs6000/sysv4le.h" ;; esac maybe_biarch=yes case ${target} in @@ -2162,6 +2162,19 @@ fi tm_file="rs6000/biarch64.h ${tm_file} rs6000/linux64.h glibc-stdint.h" tmake_file="$tmake_file rs6000/t-linux64" + case ${target} in + powerpc*le-*-*) + tmake_file="$tmake_file rs6000/t-linux64le" + case ${enable_targets} in + all | *powerpc64-* | *powerpc-*) + tmake_file="$tmake_file rs6000/t-linux64lebe" ;; + esac ;; + *) + case ${enable_targets} in + all | *powerpc64le-* | *powerpcle-*) + tmake_file="$tmake_file rs6000/t-linux64bele" ;; + esac ;; + esac extra_options="${extra_options} rs6000/linux64.opt" ;; *) Index: gcc/config/rs6000/t-linux64 =================================================================== --- gcc/config/rs6000/t-linux64 (revision 201834) +++ gcc/config/rs6000/t-linux64 (working copy) @@ -25,8 +25,8 @@ # it doesn't tell anything about the 32bit libraries on those systems. Set # MULTILIB_OSDIRNAMES according to what is found on the target. -MULTILIB_OPTIONS = m64/m32 -MULTILIB_DIRNAMES = 64 32 -MULTILIB_EXTRA_OPTS = fPIC -MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:powerpc64-linux-gnu) -MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:powerpc-linux-gnu) +MULTILIB_OPTIONS := m64/m32 +MULTILIB_DIRNAMES := 64 32 +MULTILIB_EXTRA_OPTS := +MULTILIB_OSDIRNAMES := m64=../lib64$(call if_multiarch,:powerpc64-linux-gnu) +MULTILIB_OSDIRNAMES += m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:powerpc-linux-gnu) Index: gcc/config/rs6000/t-linux64le =================================================================== --- gcc/config/rs6000/t-linux64le (revision 0) +++ gcc/config/rs6000/t-linux64le (revision 0) @@ -0,0 +1,3 @@ +#rs6000/t-linux64le + +MULTILIB_OSDIRNAMES = $(subst -linux,le-linux,$(MULTILIB_OSDIRNAMES)) Index: gcc/config/rs6000/t-linux64bele =================================================================== --- gcc/config/rs6000/t-linux64bele (revision 0) +++ gcc/config/rs6000/t-linux64bele (revision 0) @@ -0,0 +1,7 @@ +#rs6000/t-linux64end + +MULTILIB_OPTIONS += mlittle +MULTILIB_DIRNAMES += le +MULTILIB_OSDIRNAMES += $(subst =,.mlittle=,$(subst lible32,lib32le,$(subst lible64,lib64le,$(subst lib,lible,$(subst -linux,le-linux,$(MULTILIB_OSDIRNAMES)))))) +MULTILIB_OSDIRNAMES += $(subst $(if $(findstring 64,$(target)),m64,m32).,,$(filter $(if $(findstring 64,$(target)),m64,m32).mlittle%,$(MULTILIB_OSDIRNAMES))) +MULTILIB_MATCHES := ${MULTILIB_MATCHES_ENDIAN} Index: gcc/config/rs6000/t-linux64lebe =================================================================== --- gcc/config/rs6000/t-linux64lebe (revision 0) +++ gcc/config/rs6000/t-linux64lebe (revision 0) @@ -0,0 +1,7 @@ +#rs6000/t-linux64leend + +MULTILIB_OPTIONS += mbig +MULTILIB_DIRNAMES += be +MULTILIB_OSDIRNAMES += $(subst =,.mbig=,$(subst libbe32,lib32be,$(subst libbe64,lib64be,$(subst lib,libbe,$(subst le-linux,-linux,$(MULTILIB_OSDIRNAMES)))))) +MULTILIB_OSDIRNAMES += $(subst $(if $(findstring 64,$(target)),m64,m32).,,$(filter $(if $(findstring 64,$(target)),m64,m32).mbig%,$(MULTILIB_OSDIRNAMES))) +MULTILIB_MATCHES := ${MULTILIB_MATCHES_ENDIAN} -- Alan Modra Australia Development Lab, IBM