[PATCH] Fix powerpc-linux and powerpc64-linux --with-cpu=default32 bootstrap (PR bootstrap/37739)

Jakub Jelinek jakub@redhat.com
Thu Dec 11 18:44:00 GMT 2008


Hi!

The compiler grew too large, so when starting bootstrap
with 4.3 and above and stage1 is compiled with -O0, cc1
fails to link on ppc-linux because of relocation overflows.

If sufficiently new linker is used, -Wl,--relax can be used
(last important ppc -Wl,--relax bug was fixed 20080806),
otherwise the workaround is to build even stage1 with -O1.

Tested on powerpc64-linux, with new and older ld.

Ok for trunk?

2008-12-11  Jakub Jelinek  <jakub@redhat.com>

	PR bootstrap/37739
	* config.host: For powerpc*-*-linux* host with 32-bit GCC,
	use rs6000/x-linux-relax snippet if ld is new enough,
	otherwise use rs6000/x-linux-O1.
	* config/rs6000/x-linux-relax: New file.
	* config/rs6000/x-linux-O1: New file.

--- gcc/config.host.jj	2008-10-01 23:16:29.000000000 +0200
+++ gcc/config.host	2008-12-11 17:26:49.000000000 +0100
@@ -124,6 +124,29 @@ case ${host} in
         host_xmake_file="${host_xmake_file} rs6000/x-rs6000"
         ;;
     esac
+    case ${host} in
+      *-*-linux* )
+	if test x${GCC} = xyes \
+	   && echo $CC | ${CC} -E -dD -xc - \
+	      | grep '__SIZEOF_LONG__[ 	][ 	]*4' > /dev/null; then
+	  # On powerpc*-*-linux* use -Wl,--relax to link cc1,
+	  # if ld is new enough, otherwise force -O1 in CFLAGS.
+	  host_ppc_relax_xmake_file=
+	  host_ld_ver=`${CC} -Wl,--version 2>/dev/null | sed 1q`
+	  if echo "$host_ld_ver" | grep GNU > /dev/null; then
+	    host_ld_date=`echo $host_ld_ver \
+			  | sed -n 's,^.*\([2-9][0-9][0-9][0-9]\)[-]*\([01][0-9]\)[-]*\([0-3][0-9]\).*$,\1\2\3,p'`
+	    if test 0"$host_ld_date" -gt 20080806; then
+	      host_ppc_relax_xmake_file=rs6000/x-linux-relax
+	    fi
+	  fi
+	  if test -z "${host_ppc_relax_xmake_file}"; then
+	    host_ppc_relax_xmake_file=rs6000/x-linux-O1
+	  fi
+	  host_xmake_file="${host_xmake_file} ${host_ppc_relax_xmake_file}"
+	fi
+	;;
+    esac
     ;;
 esac
 
--- gcc/config/rs6000/x-linux-relax.jj	2008-12-11 15:30:29.000000000 +0100
+++ gcc/config/rs6000/x-linux-relax	2008-12-11 18:07:30.000000000 +0100
@@ -0,0 +1,2 @@
+# At -O0 cc1 etc. are too large and -Wl,--relax is needed
+$(COMPILERS) : override LDFLAGS += -Wl,--relax
--- gcc/config/rs6000/x-linux-O1.jj	2008-12-11 15:44:26.000000000 +0100
+++ gcc/config/rs6000/x-linux-O1	2008-12-11 16:19:18.000000000 +0100
@@ -0,0 +1,5 @@
+# At -O0 cc1 etc. are too large and if -Wl,--relax isn't known
+# to be working, build libbackend.a with -O1 instead.
+ifeq ($(filter-out -O0,$(filter -O%,$(CFLAGS))),)
+$(OBJS) : override CFLAGS += -O1
+endif

	Jakub



More information about the Gcc-patches mailing list