This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] PR bootstrap/65176: config.guess failed to guess machine with 64-bit kernel and 32-bit user space


32-bit and x32 user-space environments may be running under Linux/x86-64
kernel.  Using "uname -m" isn't sufficient to properly detect the
canonical system name for 32-bit and x32 user-space environments.  This
patch checks if compiler is configured for 64-bit, 32-bit or x32 objects
under Linux/x86-64 kernel.

Tested with 64-bit, 32-bit and x32 user-space environments under
Linux/x86-64 kernel.  I am not sure if this will ever be accepted in
upstream since the config.guess maintainer doesn't want to add a new
use of set_cc_for_build to config.guess.  set_cc_for_build is used for
Linux:

case "${UNAME_SYSTEM}" in
Linux|GNU|GNU/*)
        # If the system lacks a compiler, then just pick glibc.
        # We could probably try harder.
        LIBC=gnu

        eval $set_cc_for_build
        cat <<-EOF > $dummy.c
        #include <features.h>
        #if defined(__UCLIBC__)
        LIBC=uclibc
        #elif defined(__dietlibc__)
        LIBC=dietlibc
        #else
        LIBC=gnu
        #endif
        EOF
        eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
        ;;

Adding another use for Linux/x86-64 solves this issue.  I'd like to see
this fixed in gcc, binutils and glibc even if it won't be fixed in
upstream.

Thanks.

H.J.
---
	PR bootstrap/65176
	* config.guess (x86_64:Linux:*:*): Check if compiler is configured
	for 64-bit, 32-bit or x32 objects.
---
 config.guess | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/config.guess b/config.guess
index dbfb978..e5a2d41 100755
--- a/config.guess
+++ b/config.guess
@@ -1021,7 +1021,26 @@ EOF
 	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	eval $set_cc_for_build
+	LINUX_MACHINE="i686"
+	LINUX_LIBC=${LIBC}
+	# If there is a compiler, see if it is configured for 64-bit,
+	# 32-bit or x32 objects.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __x86_64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+	      LINUX_MACHINE="x86_64"
+	      if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
+		  (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		   grep IS_X32 >/dev/null
+	      then
+		LINUX_LIBC=gnux32
+	      fi
+	    fi
+	fi
+	echo ${LINUX_MACHINE}-unknown-linux-${LINUX_LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-- 
1.9.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]