This arranges to build a powerpc64le-linux compiler without -m32 support by default. Bootstrapped and regression tested on Ubuntu powerpc64le-linux without --disable-multilib, and on powerpc64-linux and powerpc-linux. OK for mainline and branches?
This part of the config.gcc patch does most of the work - case ${maybe_biarch}:${enable_targets}:${cpu_is_64bit} in - always:* | yes:*powerpc64* | yes:all:* | yes:*:yes) + case ${target}:${enable_targets}:${maybe_biarch} in + powerpc64-* | powerpc-*:*:yes | *:*powerpc64-*:yes | *:all:yes \ + | powerpc64le*:*powerpcle* | powerpc64le*:*powerpc-* \ + | powerpcle-*:*powerpc64le*:yes) always:* becomes powerpc64-*, ie. exclude powerpc64le yes:*powerpc64* becomes *:*powerpc64-*:yes, excluding powerpc64le so that --target=powerpc64le-linux --enable-targets=powerpc64le-linux doesn't accidentally get you a biarch compiler. yes:all:* becomes *:all:yes, more or less unchanged. yes:*:yes becomes powerpc-*:*:yes allowing --target=powerpc-linux --with-cpu=<supports 64-bit> to continue to build a biarch ppc64 compiler. Some other notes: t-fprules setting of MULTILIB variables is in every case overridden by a following t-file, except for the commented out powerpc-*-openbsd*. Since the aim of this patch is to build powerpc64le without multilibs, the default setting of these vars needs to go. t-ppcos needs to be removed from powerpc64le configurations for the same reason. Oh, and adding t-fprules and t-ppcos before previous additions to tmake_file is no longer necessary. I checked all the other t-files that might be added for interactions. The linux64.h change is so that passing -m32 results in error: -m32 not supported in the configuration rather than the confusing error: -m64 requires a PowerPC64 cpu (Yes, I know using TARGET_64BIT_P would be nicer, but it's probably better left to a cleanup patch.) PR target/65286 * config.gcc (powerpc*-*-linux*): Arrange for powerpc64le-linux to be single-arch by default. Set cpu_is_64bit for powerpc64 given --with-cpu=native. * config/rs6000/t-fprules: Do not set default MULTILIB vars. * config/rs6000/t-linux (MULTIARCH_DIRNAME): Support powerpc64 and powerpc64le. * config/rs6000/linux64.h (SUBSUBTARGET_OVERRIDE_OPTIONS): Test rs6000_isa_flags rather than TARGET_64BIT. Index: gcc/config.gcc =================================================================== --- gcc/config.gcc (revision 221164) +++ gcc/config.gcc (working copy) @@ -2337,28 +2337,32 @@ powerpc*-*-linux*) tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h freebsd-spec.h rs6000/sysv4.h" extra_options="${extra_options} rs6000/sysv4.opt" - tmake_file="rs6000/t-fprules rs6000/t-ppcos ${tmake_file} rs6000/t-ppccomm" + tmake_file="${tmake_file} rs6000/t-fprules rs6000/t-ppccomm" extra_objs="$extra_objs rs6000-linux.o" case ${target} in powerpc*le-*-*) tm_file="${tm_file} rs6000/sysv4le.h" ;; esac - maybe_biarch=yes + case ${target}:${with_cpu} in + powerpc64*: | powerpc64*:native) cpu_is_64bit=yes ;; + esac + maybe_biarch=${cpu_is_64bit} + case ${enable_targets} in + *powerpc64*) maybe_biarch=yes ;; + esac case ${target} in powerpc64*-*-linux*spe* | powerpc64*-*-linux*paired*) - echo "*** Configuration ${target} not supported" 1>&2 + echo "*** Configuration ${target} not supported" 1>&2 exit 1 ;; powerpc*-*-linux*spe* | powerpc*-*-linux*paired*) maybe_biarch= ;; - powerpc64*-*-linux*) - test x$with_cpu != x || cpu_is_64bit=yes - maybe_biarch=always - ;; esac - case ${maybe_biarch}:${enable_targets}:${cpu_is_64bit} in - always:* | yes:*powerpc64* | yes:all:* | yes:*:yes) + case ${target}:${enable_targets}:${maybe_biarch} in + powerpc64-* | powerpc-*:*:yes | *:*powerpc64-*:yes | *:all:yes \ + | powerpc64le*:*powerpcle* | powerpc64le*:*powerpc-* \ + | powerpcle-*:*powerpc64le*:yes) if test x$cpu_is_64bit = xyes; then tm_file="${tm_file} rs6000/default64.h" fi @@ -2379,9 +2383,14 @@ esac extra_options="${extra_options} rs6000/linux64.opt" ;; + powerpc64*) + tm_file="${tm_file} rs6000/default64.h rs6000/linux64.h glibc-stdint.h" + extra_options="${extra_options} rs6000/linux64.opt" + tmake_file="${tmake_file} rs6000/t-linux" + ;; *) tm_file="${tm_file} rs6000/linux.h glibc-stdint.h" - tmake_file="$tmake_file rs6000/t-linux" + tmake_file="${tmake_file} rs6000/t-ppcos rs6000/t-linux" ;; esac case ${target} in Index: gcc/config/rs6000/t-fprules =================================================================== --- gcc/config/rs6000/t-fprules (revision 221164) +++ gcc/config/rs6000/t-fprules (working copy) @@ -18,9 +18,3 @@ SOFT_FLOAT_CPUS = e300c2 401 403 405 440 464 476 ec603e 801 821 823 860 MULTILIB_MATCHES_FLOAT = $(foreach cpu, $(SOFT_FLOAT_CPUS), msoft-float=mcpu?$(cpu)) - -# Build the libraries for both hard and soft floating point by default - -MULTILIB_OPTIONS = msoft-float -MULTILIB_DIRNAMES = soft-float -MULTILIB_MATCHES = ${MULTILIB_MATCHES_FLOAT} Index: gcc/config/rs6000/t-linux =================================================================== --- gcc/config/rs6000/t-linux (revision 221164) +++ gcc/config/rs6000/t-linux (working copy) @@ -1,12 +1,19 @@ # do not define the multiarch name if configured for a soft-float cpu # or soft-float. ifeq (,$(filter $(with_cpu),$(SOFT_FLOAT_CPUS))$(findstring soft,$(with_float))) +ifneq (,$(findstring powerpc64,$(target))) +MULTIARCH_DIRNAME := powerpc64-linux-gnu +else ifneq (,$(findstring spe,$(target))) -MULTIARCH_DIRNAME = powerpc-linux-gnuspe$(if $(findstring 8548,$(with_cpu)),,v1) +MULTIARCH_DIRNAME := powerpc-linux-gnuspe$(if $(findstring 8548,$(with_cpu)),,v1) else -MULTIARCH_DIRNAME = powerpc-linux-gnu +MULTIARCH_DIRNAME := powerpc-linux-gnu endif endif +ifneq (,$(findstring powerpcle,$(target))$(findstring powerpc64le,$(target))) +MULTIARCH_DIRNAME := $(subst -linux,le-linux,$(MULTIARCH_DIRNAME)) +endif +endif rs6000-linux.o: $(srcdir)/config/rs6000/rs6000-linux.c $(COMPILE) $< Index: gcc/config/rs6000/linux64.h =================================================================== --- gcc/config/rs6000/linux64.h (revision 221164) +++ gcc/config/rs6000/linux64.h (working copy) @@ -97,7 +97,7 @@ { \ if (!global_options_set.x_rs6000_alignment_flags) \ rs6000_alignment_flags = MASK_ALIGN_NATURAL; \ - if (TARGET_64BIT) \ + if (rs6000_isa_flags & OPTION_MASK_64BIT) \ { \ if (DEFAULT_ABI != ABI_AIX) \ { \ -- Alan Modra Australia Development Lab, IBM