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

Reply via email to