diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2015-10-22 12:54:45 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2015-10-26 19:57:54 +0000 |
commit | 00f35b4ae7f94e0fe1c8c77efec401ab5f3c4855 (patch) | |
tree | 55e38db3a1f83af0dfecab6783ab246a0a83646a | |
parent | 3b447ae1f3b60794bdceaa4c590751a97b43bd1b (diff) |
Move pointer size detection entirely to qprocessordetection.h
This commit removes the legacy ptrsize check, which was deficient
because it did not work for multiarch systems (when we supported fat
OS X binaries) and did not work for bootstrap builds because the size
might be different when cross-compiling.
Instead, let's rely on the predefined preprocessor macros to detect
correctly. As a nice side-effect, this fixes 64-bit Android builds
cross-compiled from Windows.
Task-number: QTBUG-48932
Change-Id: I1d0f78915b5942aab07cffff140f9a52b9342f23
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
-rwxr-xr-x | config.tests/unix/ptrsize.test | 35 | ||||
-rw-r--r-- | config.tests/unix/ptrsize/ptrsizetest.cpp | 53 | ||||
-rw-r--r-- | config.tests/unix/ptrsize/ptrsizetest.pro | 3 | ||||
-rwxr-xr-x | configure | 13 | ||||
-rw-r--r-- | src/corelib/global/qglobal.cpp | 4 | ||||
-rw-r--r-- | src/corelib/global/qglobal.h | 12 | ||||
-rw-r--r-- | src/corelib/global/qprocessordetection.h | 35 | ||||
-rw-r--r-- | tools/configure/configureapp.cpp | 7 |
8 files changed, 28 insertions, 134 deletions
diff --git a/config.tests/unix/ptrsize.test b/config.tests/unix/ptrsize.test deleted file mode 100755 index 7d7bde57e5..0000000000 --- a/config.tests/unix/ptrsize.test +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh - -QMKSPEC=$1 -VERBOSE=$2 -SRCDIR=$3 -OUTDIR=$4 - -LFLAGS=$SYSROOT_FLAG -CXXFLAGS=$SYSROOT_FLAG - -# debuggery -[ "$VERBOSE" = "yes" ] && echo "Testing size of pointers ... ($*)" - -# build and run a test program -test -d "$OUTDIR/config.tests/unix/ptrsize" || mkdir -p "$OUTDIR/config.tests/unix/ptrsize" -"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG-=app_bundle" "QMAKE_LFLAGS*=$LFLAGS" "QMAKE_CXXFLAGS*=$CXXFLAGS" "$SRCDIR/config.tests/unix/ptrsize/ptrsizetest.pro" -o "$OUTDIR/config.tests/unix/ptrsize/Makefile" >/dev/null 2>&1 -cd "$OUTDIR/config.tests/unix/ptrsize" - -if [ "$VERBOSE" = "yes" ]; then - ($MAKE clean && $MAKE) -else - ($MAKE clean && $MAKE) >/dev/null 2>&1 -fi -RETVAL=$? - -if [ "$RETVAL" -ne 0 ]; then - PTRSIZE=4 -else - PTRSIZE=8 -fi - - -# done -[ "$VERBOSE" = "yes" ] && echo "Pointer size: $PTRSIZE" -exit $PTRSIZE diff --git a/config.tests/unix/ptrsize/ptrsizetest.cpp b/config.tests/unix/ptrsize/ptrsizetest.cpp deleted file mode 100644 index 826095d0e9..0000000000 --- a/config.tests/unix/ptrsize/ptrsizetest.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the config.tests of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/* Sample program for configure to test pointer size on target -platforms. -*/ - -template<int> -struct QPointerSizeTest -{ -}; - -template<> -struct QPointerSizeTest<8> -{ - enum { PointerSize = 8 }; -}; - -int main( int, char ** ) -{ - return QPointerSizeTest<sizeof(void*)>::PointerSize; -} - diff --git a/config.tests/unix/ptrsize/ptrsizetest.pro b/config.tests/unix/ptrsize/ptrsizetest.pro deleted file mode 100644 index a7ae38a5d9..0000000000 --- a/config.tests/unix/ptrsize/ptrsizetest.pro +++ /dev/null @@ -1,3 +0,0 @@ -SOURCES = ptrsizetest.cpp -CONFIG -= qt dylib -CONFIG += debug console @@ -6738,19 +6738,6 @@ if [ "$CFG_FRAMEWORK" = "yes" ]; then echo "#define QT_MAC_FRAMEWORK_BUILD" fi -if [ "$XPLATFORM_MAC" = "yes" ]; then - cat <<EOF -#if defined(__LP64__) -# define QT_POINTER_SIZE 8 -#else -# define QT_POINTER_SIZE 4 -#endif -EOF -else - "$unixtests/ptrsize.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" >&3 - echo "#define QT_POINTER_SIZE $?" -fi - if [ "$CFG_ATOMIC64" = "no" ]; then echo "#define QT_NO_STD_ATOMIC64" fi diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 02220d0db2..ed8a9163d4 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -120,9 +120,7 @@ Q_CORE_EXPORT void *qMemSet(void *dest, int c, size_t n); // (if this list becomes too long, consider factoring into a separate file) Q_STATIC_ASSERT_X(sizeof(int) == 4, "Qt assumes that int is 32 bits"); Q_STATIC_ASSERT_X(UCHAR_MAX == 255, "Qt assumes that char is 8 bits"); -#ifndef QT_BOOTSTRAPPED -Q_STATIC_ASSERT_X(QT_POINTER_SIZE == sizeof(void *), "configure test ptrsize failed to correctly determine QT_POINTER_SIZE"); -#endif +Q_STATIC_ASSERT_X(QT_POINTER_SIZE == sizeof(void *), "QT_POINTER_SIZE defined incorrectly"); /*! \class QFlag diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index d86e410194..db8c60831f 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -193,18 +193,6 @@ typedef unsigned long long quint64; /* 64 bit unsigned */ typedef qint64 qlonglong; typedef quint64 qulonglong; -#ifndef QT_POINTER_SIZE -# if defined(Q_OS_WIN64) || (defined(Q_OS_WINRT) && defined(_M_X64)) -# define QT_POINTER_SIZE 8 -# elif defined(Q_OS_WIN32) || defined(Q_OS_WINCE) || defined(Q_OS_WINRT) -# define QT_POINTER_SIZE 4 -# elif defined(Q_OS_ANDROID) -# define QT_POINTER_SIZE 4 // ### Add auto-detection to Windows configure -# elif !defined(QT_BOOTSTRAPPED) -# error could not determine QT_POINTER_SIZE -# endif -#endif - /* Useful type definitions for Qt */ diff --git a/src/corelib/global/qprocessordetection.h b/src/corelib/global/qprocessordetection.h index a026224021..4b75872bb6 100644 --- a/src/corelib/global/qprocessordetection.h +++ b/src/corelib/global/qprocessordetection.h @@ -91,6 +91,7 @@ # define Q_PROCESSOR_ARM # if defined(__aarch64__) # define Q_PROCESSOR_ARM_64 +# define Q_PROCESSOR_WORDSIZE 8 # else # define Q_PROCESSOR_ARM_32 # endif @@ -228,6 +229,7 @@ # endif # if defined(_MIPS_ARCH_MIPS64) || defined(__mips64) # define Q_PROCESSOR_MIPS_64 +# define Q_PROCESSOR_WORDSIZE 8 # endif # if defined(__MIPSEL__) # define Q_BYTE_ORDER Q_LITTLE_ENDIAN @@ -252,6 +254,7 @@ # define Q_PROCESSOR_POWER # if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__) # define Q_PROCESSOR_POWER_64 +# define Q_PROCESSOR_WORDSIZE 8 # else # define Q_PROCESSOR_POWER_32 # endif @@ -323,6 +326,28 @@ #endif /* + Size of a pointer and the machine register size. We detect a 64-bit system by: + * GCC and compatible compilers (Clang, ICC on OS X and Windows) always define + __SIZEOF_POINTER__. This catches all known cases of ILP32 builds on 64-bit + processors. + * Most other Unix compilers define __LP64__ or _LP64 on 64-bit mode + (Long and Pointer 64-bit) + * If Q_PROCESSOR_WORDSIZE was defined above, it's assumed to match the pointer + size. + Otherwise, we assume to be 32-bit and then check in qglobal.cpp that it is right. +*/ + +#if defined __SIZEOF_POINTER__ +# define QT_POINTER_SIZE __SIZEOF_POINTER__ +#elif defined(__LP64__) || defined(_LP64) +# define QT_POINTER_SIZE 8 +#elif defined(Q_PROCESSOR_WORDSIZE) +# define QT_POINTER_SIZE Q_PROCESSOR_WORDSIZE +#else +# define QT_POINTER_SIZE 4 +#endif + +/* Define Q_PROCESSOR_WORDSIZE to be the size of the machine's word (usually, the size of the register). On some architectures where a pointer could be smaller than the register, the macro is defined above. @@ -330,14 +355,8 @@ Falls back to QT_POINTER_SIZE if not set explicitly for the platform. */ #ifndef Q_PROCESSOR_WORDSIZE -# ifdef __SIZEOF_POINTER__ - /* GCC & friends define this */ -# define Q_PROCESSOR_WORDSIZE __SIZEOF_POINTER__ -# elif defined(_LP64) || defined(__LP64__) || defined(WIN64) || defined(_WIN64) -# define Q_PROCESSOR_WORDSIZE 8 -# else -# define Q_PROCESSOR_WORDSIZE QT_POINTER_SIZE -# endif +# define Q_PROCESSOR_WORDSIZE QT_POINTER_SIZE #endif + #endif // QPROCESSORDETECTION_H diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 886a383122..6c3217baeb 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -2579,11 +2579,6 @@ void Configure::autoDetection() i.value() = defaultTo(i.key()); } - if (tryCompileProject("unix/ptrsize")) - dictionary["QT_POINTER_SIZE"] = "8"; - else - dictionary["QT_POINTER_SIZE"] = "4"; - cout << "Done running configuration tests." << endl; } @@ -3762,8 +3757,6 @@ void Configure::generateConfigfiles() if (dictionary["REDUCE_RELOCATIONS"] == "yes") qconfigList += "QT_REDUCE_RELOCATIONS"; if (dictionary["QT_GETIFADDRS"] == "no") qconfigList += "QT_NO_GETIFADDRS"; - qconfigList += QString("QT_POINTER_SIZE=%1").arg(dictionary["QT_POINTER_SIZE"]); - qconfigList.sort(); for (int i = 0; i < qconfigList.count(); ++i) tmpStream << addDefine(qconfigList.at(i)); |