diff options
-rw-r--r-- | mkspecs/features/qt_common.prf | 3 | ||||
-rw-r--r-- | src/corelib/global/qendian.h | 26 |
2 files changed, 13 insertions, 16 deletions
diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf index af9d6cae67..eb65e73079 100644 --- a/mkspecs/features/qt_common.prf +++ b/mkspecs/features/qt_common.prf @@ -50,9 +50,6 @@ warnings_are_errors:warning_clean { reg_ver = $${QT_CLANG_MAJOR_VERSION}.$${QT_CLANG_MINOR_VERSION} contains(apple_ver, "4\\.[012]|5\\.[01]")|contains(reg_ver, "3\\.[34]") { QMAKE_CXXFLAGS_WARN_ON += -Werror -Wno-error=\\$${LITERAL_HASH}warnings -Wno-error=deprecated-declarations $$WERROR - - # glibc's bswap_XX macros use the "register" keyword - linux:equals(reg_ver, "3.4"): QMAKE_CXXFLAGS_WARN_ON += -Wno-error=deprecated-register } } else:intel_icc:linux { # Intel CC 13.0 - 15.0, on Linux only diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h index 136581167c..7c643f7592 100644 --- a/src/corelib/global/qendian.h +++ b/src/corelib/global/qendian.h @@ -40,10 +40,6 @@ #include <stdlib.h> #include <string.h> -#ifdef __GLIBC__ -#include <byteswap.h> -#endif - QT_BEGIN_NAMESPACE @@ -276,18 +272,16 @@ template <> inline qint8 qFromBigEndian<qint8>(const uchar *src) */ template <typename T> T qbswap(T source); -#ifdef __GLIBC__ +// GCC 4.3 implemented all the intrinsics, but the 16-bit one only got implemented in 4.8; +// Clang 2.6 implemented the 32- and 64-bit but waited until 3.2 to implement the 16-bit one +#if (defined(Q_CC_GNU) && Q_CC_GNU >= 403) || (defined(Q_CC_CLANG) && Q_CC_CLANG >= 206) template <> inline quint64 qbswap<quint64>(quint64 source) { - return bswap_64(source); + return __builtin_bswap64(source); } template <> inline quint32 qbswap<quint32>(quint32 source) { - return bswap_32(source); -} -template <> inline quint16 qbswap<quint16>(quint16 source) -{ - return bswap_16(source); + return __builtin_bswap32(source); } #else template <> inline quint64 qbswap<quint64>(quint64 source) @@ -311,14 +305,20 @@ template <> inline quint32 qbswap<quint32>(quint32 source) | ((source & 0x00ff0000) >> 8) | ((source & 0xff000000) >> 24); } - +#endif // GCC & Clang intrinsics +#if (defined(Q_CC_GNU) && Q_CC_GNU >= 408) || (defined(Q_CC_CLANG) && Q_CC_CLANG >= 302) +template <> inline quint16 qbswap<quint16>(quint16 source) +{ + return __builtin_bswap16(source); +} +#else template <> inline quint16 qbswap<quint16>(quint16 source) { return quint16( 0 | ((source & 0x00ff) << 8) | ((source & 0xff00) >> 8) ); } -#endif // __GLIBC__ +#endif // GCC & Clang intrinsics // signed specializations template <> inline qint64 qbswap<qint64>(qint64 source) |