Package: src:qt4-x11 Followup-For: Bug #735488
OK. So I've brought the atomic queries to the attention of Steve Capper, who understands this stuff. He observed that the memory barriers are not the right type. They'll work (as they are the 'mos expensive' type) but will be slower than is necessary. Hopefully he'll find time to have a look at that reasonably soon, but he's a busy man at the moment. In an attempt to solve the -fpermissive thing, I updated the patches for the current qt4-x11 package to try and get an example build log (without -fpermissive) to wave at people who grokked C++ and arm64. This involved some tweaking of the arch/ABI identification logic wich was bust and by using dpkg_arch ('arm64') in place of uname -m ('aarch64') then checking for arm* later, it incorrectly identified the ABI as 'arm' and tried to build wrong assembler. So I've fixed that up to not use the hacky mechanism and re-order the checks/extend the regeps so both arm64 and aarch64 end up pointing at QTs internel 'aarch64', and other arm* names refer to QTs internal 'arm'. And now it seems that the -fpermissive problem has gone away. The package builds without -fpermissive on arm64 (maybe updated compiler, maybe updated sources, maybe updated something else - who knows? Anyway I guess we can call it fixed until we see evidence otherwise. Attached is current patch (obviously with atomics stuff unchanged) (The nice neat separated patches did not work for me and I've not had time to separate this one out into nice pieces, sorry). Can we upload this so we at least have a working package in the archive (which will very soon be needed by our nice new official buildds), and refine the atomics patch for upstreaming in due course? -- Wookey
diff -Nru qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/changelog qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/changelog --- qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/changelog 2014-07-25 17:07:51.000000000 +0000 +++ qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/changelog 2014-08-14 11:25:08.000000000 +0000 @@ -1,3 +1,10 @@ +qt4-x11 (4:4.8.6+git49-gbc62005+dfsg-1.1) unstable; urgency=low + + * Non-maintainer upload. + * Add arm64/aarch64 support + + -- Wookey <woo...@debian.org> Thu, 14 Aug 2014 11:24:00 +0000 + qt4-x11 (4:4.8.6+git49-gbc62005+dfsg-1) unstable; urgency=medium * New upstream GIT snapshot. diff -Nru qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/libqt4-dev.install qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/libqt4-dev.install --- qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/libqt4-dev.install 2014-07-25 16:54:39.000000000 +0000 +++ qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/libqt4-dev.install 2014-08-15 10:19:56.000000000 +0000 @@ -161,6 +161,7 @@ usr/include/qt4/Qt/qanimationgroup.h usr/include/qt4/Qt/qapplication.h usr/include/qt4/Qt/qatomic.h +usr/include/qt4/Qt/qatomic_aarch64.h usr/include/qt4/Qt/qatomic_alpha.h usr/include/qt4/Qt/qatomic_arch.h usr/include/qt4/Qt/qatomic_arm.h @@ -1345,6 +1346,7 @@ usr/include/qt4/QtCore/qalgorithms.h usr/include/qt4/QtCore/qanimationgroup.h usr/include/qt4/QtCore/qatomic.h +usr/include/qt4/QtCore/qatomic_aarch64.h usr/include/qt4/QtCore/qatomic_alpha.h usr/include/qt4/QtCore/qatomic_arch.h usr/include/qt4/QtCore/qatomic_arm.h diff -Nru qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/aarch64.patch qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/aarch64.patch --- qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/aarch64.patch 1970-01-01 00:00:00.000000000 +0000 +++ qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/aarch64.patch 2014-08-15 10:36:18.000000000 +0000 @@ -0,0 +1,619 @@ +Index: qt4-x11-4.8.6+git49-gbc62005+dfsg/configure +=================================================================== +--- qt4-x11-4.8.6+git49-gbc62005+dfsg.orig/configure ++++ qt4-x11-4.8.6+git49-gbc62005+dfsg/configure +@@ -2856,6 +2856,9 @@ if [ "$CFG_EMBEDDED" != "no" ]; then + *86_64) + PLATFORM=qws/linux-x86_64-g++ + ;; ++ aarch64) ++ PLATFORM=linux-g++-aarch64 ++ ;; + *) + PLATFORM=qws/linux-generic-g++ + ;; +@@ -3289,18 +3292,18 @@ if [ -z "${CFG_HOST_ARCH}" ]; then + fi + CFG_HOST_ARCH=s390 + ;; +- *:*:arm*) +- if [ "$OPT_VERBOSE" = "yes" ]; then +- echo " ARM (arm)" +- fi +- CFG_HOST_ARCH=arm +- ;; +- *:*:aarch64*) ++ *:*:aarch64*|*:*:arm64*) + if [ "$OPT_VERBOSE" = "yes" ]; then + echo " AArch64 (aarch64)" + fi + CFG_HOST_ARCH=aarch64 + ;; ++ *:*:arm*) ++ if [ "$OPT_VERBOSE" = "yes" ]; then ++ echo " ARM (arm)" ++ fi ++ CFG_HOST_ARCH=arm ++ ;; + Linux:*:sparc*) + if [ "$OPT_VERBOSE" = "yes" ]; then + echo " Linux on SPARC" +Index: qt4-x11-4.8.6+git49-gbc62005+dfsg/mkspecs/linux-g++-aarch64/qmake.conf +=================================================================== +--- /dev/null ++++ qt4-x11-4.8.6+git49-gbc62005+dfsg/mkspecs/linux-g++-aarch64/qmake.conf +@@ -0,0 +1,28 @@ ++# ++# qmake configuration for linux-g++ ++# ++# Written for GNU/Linux platforms that have both lib and lib64 directories, ++# like the AMD Opteron. ++# ++ ++MAKEFILE_GENERATOR = UNIX ++TARGET_PLATFORM = unix ++TEMPLATE = app ++CONFIG += qt warn_on release incremental link_prl gdb_dwarf_index ++QT += core gui ++QMAKE_INCREMENTAL_STYLE = sublib ++ ++QMAKE_CFLAGS = ++QMAKE_LFLAGS = ++ ++QMAKE_CFLAGS_RELEASE += -O2 ++ ++include(../common/linux.conf) ++include(../common/gcc-base-unix.conf) ++include(../common/g++-unix.conf) ++ ++ ++QMAKE_LIBDIR_X11 = /usr/X11R6/lib64 ++QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib64 ++ ++load(qt_config) +Index: qt4-x11-4.8.6+git49-gbc62005+dfsg/mkspecs/linux-g++-aarch64/qplatformdefs.h +=================================================================== +--- /dev/null ++++ qt4-x11-4.8.6+git49-gbc62005+dfsg/mkspecs/linux-g++-aarch64/qplatformdefs.h +@@ -0,0 +1,42 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the qmake spec of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** 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 Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/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 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "../linux-g++/qplatformdefs.h" +Index: qt4-x11-4.8.6+git49-gbc62005+dfsg/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h +=================================================================== +--- qt4-x11-4.8.6+git49-gbc62005+dfsg.orig/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h ++++ qt4-x11-4.8.6+git49-gbc62005+dfsg/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h +@@ -246,6 +246,11 @@ + + #endif + ++/* CPU(AARCH64) - AArch64 */ ++#if defined(__aarch64__) ++#define WTF_CPU_AARCH64 1 ++#endif ++ + #define WTF_ARM_ARCH_AT_LEAST(N) (CPU(ARM) && WTF_ARM_ARCH_VERSION >= N) + + /* Set WTF_ARM_ARCH_VERSION */ +Index: qt4-x11-4.8.6+git49-gbc62005+dfsg/src/3rdparty/webkit/Source/JavaScriptCore/wtf/Platform.h +=================================================================== +--- qt4-x11-4.8.6+git49-gbc62005+dfsg.orig/src/3rdparty/webkit/Source/JavaScriptCore/wtf/Platform.h ++++ qt4-x11-4.8.6+git49-gbc62005+dfsg/src/3rdparty/webkit/Source/JavaScriptCore/wtf/Platform.h +@@ -369,10 +369,15 @@ + + #endif /* ARM */ + +-#if CPU(ARM) || CPU(MIPS) || CPU(SH4) ++#if CPU(ARM) || CPU(MIPS) || CPU(SH4) || CPU(AARCH64) + #define WTF_CPU_NEEDS_ALIGNED_ACCESS 1 + #endif + ++/* CPU(AARCH64) - Aarch64 */ ++#if defined(__aarch64__) ++#define WTF_CPU_AARCH64 1 ++#endif ++ + /* ==== OS() - underlying operating system; only to be used for mandated low-level services like + virtual memory, not to choose a GUI toolkit ==== */ + +@@ -1003,7 +1008,8 @@ + || CPU(SPARC64) \ + || CPU(S390X) \ + || CPU(PPC64) \ +- || CPU(MIPS64) ++ || CPU(MIPS64) \ ++ || CPU(AARCH64) + #define WTF_USE_JSVALUE64 1 + #else + #define WTF_USE_JSVALUE32_64 1 +Index: qt4-x11-4.8.6+git49-gbc62005+dfsg/src/corelib/arch/aarch64/arch.pri +=================================================================== +--- /dev/null ++++ qt4-x11-4.8.6+git49-gbc62005+dfsg/src/corelib/arch/aarch64/arch.pri +@@ -0,0 +1,4 @@ ++# ++# AArch64 architecture ++# ++SOURCES += $$QT_ARCH_CPP/qatomic_aarch64.cpp +Index: qt4-x11-4.8.6+git49-gbc62005+dfsg/src/corelib/arch/aarch64/qatomic_aarch64.cpp +=================================================================== +--- /dev/null ++++ qt4-x11-4.8.6+git49-gbc62005+dfsg/src/corelib/arch/aarch64/qatomic_aarch64.cpp +@@ -0,0 +1,70 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2012, 2013 Digia Plc and/or its subsidiary(-ies). ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the QtCore module of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** 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 Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/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 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#include <QtCore/qglobal.h> ++ ++#include <unistd.h> ++#ifdef _POSIX_PRIORITY_SCHEDULING ++# include <sched.h> ++#endif ++#include <time.h> ++ ++QT_BEGIN_NAMESPACE ++ ++QT_USE_NAMESPACE ++ ++Q_CORE_EXPORT void qt_atomic_yield(int *count) ++{ ++#ifdef _POSIX_PRIORITY_SCHEDULING ++ if((*count)++ < 50) { ++ sched_yield(); ++ } else ++#endif ++ { ++ struct timespec tm; ++ tm.tv_sec = 0; ++ tm.tv_nsec = 2000001; ++ nanosleep(&tm, NULL); ++ *count = 0; ++ } ++} ++ ++QT_END_NAMESPACE +Index: qt4-x11-4.8.6+git49-gbc62005+dfsg/src/corelib/arch/arch.pri +=================================================================== +--- qt4-x11-4.8.6+git49-gbc62005+dfsg.orig/src/corelib/arch/arch.pri ++++ qt4-x11-4.8.6+git49-gbc62005+dfsg/src/corelib/arch/arch.pri +@@ -31,7 +31,9 @@ integrity:HEADERS += arch/qatomic_integr + arch/qatomic_s390.h \ + arch/qatomic_x86_64.h \ + arch/qatomic_sh.h \ +- arch/qatomic_sh4a.h ++ arch/qatomic_sh4a.h \ ++ arch/qatomic_aarch64.h \ ++ + + QT_ARCH_CPP = $$QT_SOURCE_TREE/src/corelib/arch/$$QT_ARCH + DEPENDPATH += $$QT_ARCH_CPP +Index: qt4-x11-4.8.6+git49-gbc62005+dfsg/src/corelib/arch/qatomic_aarch64.h +=================================================================== +--- /dev/null ++++ qt4-x11-4.8.6+git49-gbc62005+dfsg/src/corelib/arch/qatomic_aarch64.h +@@ -0,0 +1,335 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the QtCore module of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** 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 Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/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 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef QATOMIC_AARCH64_H ++#define QATOMIC_AARCH64_H ++ ++QT_BEGIN_HEADER ++ ++QT_BEGIN_NAMESPACE ++ ++#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE ++ ++inline bool QBasicAtomicInt::isReferenceCountingNative() ++{ return true; } ++inline bool QBasicAtomicInt::isReferenceCountingWaitFree() ++{ return false; } ++ ++#define Q_ATOMIC_INT_TEST_AND_SET_IS_ALWAYS_NATIVE ++ ++inline bool QBasicAtomicInt::isTestAndSetNative() ++{ return true; } ++inline bool QBasicAtomicInt::isTestAndSetWaitFree() ++{ return false; } ++ ++#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_ALWAYS_NATIVE ++ ++inline bool QBasicAtomicInt::isFetchAndStoreNative() ++{ return true; } ++inline bool QBasicAtomicInt::isFetchAndStoreWaitFree() ++{ return false; } ++ ++#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_ALWAYS_NATIVE ++ ++inline bool QBasicAtomicInt::isFetchAndAddNative() ++{ return true; } ++inline bool QBasicAtomicInt::isFetchAndAddWaitFree() ++{ return false; } ++ ++#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE ++ ++template <typename T> ++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative() ++{ return true; } ++template <typename T> ++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree() ++{ return false; } ++ ++#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE ++ ++template <typename T> ++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative() ++{ return true; } ++template <typename T> ++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree() ++{ return false; } ++ ++#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE ++ ++template <typename T> ++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative() ++{ return true; } ++template <typename T> ++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree() ++{ return false; } ++ ++#ifndef Q_DATA_MEMORY_BARRIER ++# define Q_DATA_MEMORY_BARRIER asm volatile("dmb sy\n":::"memory") ++#endif ++#ifndef Q_COMPILER_MEMORY_BARRIER ++# define Q_COMPILER_MEMORY_BARRIER asm volatile("":::"memory") ++#endif ++ ++inline bool QBasicAtomicInt::ref() ++{ ++ int newValue; ++ ++ Q_COMPILER_MEMORY_BARRIER; ++ newValue = __atomic_add_fetch(&_q_value, 1, __ATOMIC_ACQ_REL); ++ Q_COMPILER_MEMORY_BARRIER; ++ ++ return newValue != 0; ++} ++ ++inline bool QBasicAtomicInt::deref() ++{ ++ int newValue; ++ ++ Q_COMPILER_MEMORY_BARRIER; ++ newValue = __atomic_sub_fetch(&_q_value, 1, __ATOMIC_ACQ_REL); ++ Q_COMPILER_MEMORY_BARRIER; ++ ++ return newValue != 0; ++} ++ ++inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) ++{ ++ bool val; ++ ++ Q_COMPILER_MEMORY_BARRIER; ++ val = __atomic_compare_exchange_n (&_q_value, &expectedValue, &newValue, ++ false, __ATOMIC_RELAXED, __ATOMIC_RELAXED); ++ Q_COMPILER_MEMORY_BARRIER; ++ return val; ++} ++ ++inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) ++{ ++ int val; ++ Q_COMPILER_MEMORY_BARRIER; ++ val = __atomic_exchange_n(&_q_value, newValue, __ATOMIC_RELAXED); ++ Q_COMPILER_MEMORY_BARRIER; ++ return val; ++} ++ ++inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) ++{ ++ int val; ++ Q_COMPILER_MEMORY_BARRIER; ++ val = __atomic_fetch_add(&_q_value, valueToAdd, __ATOMIC_RELAXED); ++ Q_COMPILER_MEMORY_BARRIER; ++ return val; ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue) ++{ ++ bool val; ++ Q_COMPILER_MEMORY_BARRIER; ++ val = __atomic_compare_exchange_n (&_q_value, &expectedValue, &newValue, ++ false, __ATOMIC_RELAXED, __ATOMIC_RELAXED); ++ Q_COMPILER_MEMORY_BARRIER; ++ return val; ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue) ++{ ++ T *val; ++ Q_COMPILER_MEMORY_BARRIER; ++ val = __atomic_exchange_n(&_q_value, newValue, __ATOMIC_RELAXED); ++ Q_COMPILER_MEMORY_BARRIER; ++ return val; ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd) ++{ ++ T *val; ++ Q_COMPILER_MEMORY_BARRIER; ++ val = __atomic_fetch_add(&_q_value, valueToAdd, __ATOMIC_RELAXED); ++ Q_COMPILER_MEMORY_BARRIER; ++ return val; ++} ++ ++inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) ++{ ++ bool returnValue = testAndSetRelaxed(expectedValue, newValue); ++ Q_DATA_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ return testAndSetRelaxed(expectedValue, newValue); ++} ++ ++inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ bool returnValue = testAndSetRelaxed(expectedValue, newValue); ++ Q_COMPILER_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue) ++{ ++ int returnValue = fetchAndStoreRelaxed(newValue); ++ Q_DATA_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ return fetchAndStoreRelaxed(newValue); ++} ++ ++inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ int returnValue = fetchAndStoreRelaxed(newValue); ++ Q_COMPILER_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd) ++{ ++ int returnValue = fetchAndAddRelaxed(valueToAdd); ++ Q_DATA_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ return fetchAndAddRelaxed(valueToAdd); ++} ++ ++inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ int returnValue = fetchAndAddRelaxed(valueToAdd); ++ Q_COMPILER_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue) ++{ ++ bool returnValue = testAndSetRelaxed(expectedValue, newValue); ++ Q_DATA_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ return testAndSetRelaxed(expectedValue, newValue); ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ bool returnValue = testAndSetAcquire(expectedValue, newValue); ++ Q_COMPILER_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue) ++{ ++ T *returnValue = fetchAndStoreRelaxed(newValue); ++ Q_DATA_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ return fetchAndStoreRelaxed(newValue); ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ T *returnValue = fetchAndStoreRelaxed(newValue); ++ Q_COMPILER_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd) ++{ ++ T *returnValue = fetchAndAddRelaxed(valueToAdd); ++ Q_DATA_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ return fetchAndAddRelaxed(valueToAdd); ++} ++ ++template <typename T> ++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd) ++{ ++ Q_DATA_MEMORY_BARRIER; ++ T *returnValue = fetchAndAddRelaxed(valueToAdd); ++ Q_COMPILER_MEMORY_BARRIER; ++ return returnValue; ++} ++ ++#undef Q_DATA_MEMORY_BARRIER ++#undef Q_COMPILER_MEMORY_BARRIER ++ ++QT_END_NAMESPACE ++ ++QT_END_HEADER ++ ++#endif // QATOMIC_AARCH64_H +Index: qt4-x11-4.8.6+git49-gbc62005+dfsg/src/corelib/arch/qatomic_arch.h +=================================================================== +--- qt4-x11-4.8.6+git49-gbc62005+dfsg.orig/src/corelib/arch/qatomic_arch.h ++++ qt4-x11-4.8.6+git49-gbc62005+dfsg/src/corelib/arch/qatomic_arch.h +@@ -94,6 +94,8 @@ QT_BEGIN_HEADER + # include "QtCore/qatomic_sh4a.h" + #elif defined(QT_ARCH_NACL) + # include "QtCore/qatomic_generic.h" ++#elif defined(QT_ARCH_AARCH64) ++# include "QtCore/qatomic_aarch64.h" + #else + # error "Qt has not been ported to this architecture" + #endif diff -Nru qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/aarch64_fix_atomic_set.patch qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/aarch64_fix_atomic_set.patch --- qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/aarch64_fix_atomic_set.patch 1970-01-01 00:00:00.000000000 +0000 +++ qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/aarch64_fix_atomic_set.patch 2014-08-14 11:18:03.000000000 +0000 @@ -0,0 +1,29 @@ +Description: Fix aarch64 atomic test and set to set the right value. + QBasicAtomicInt::testAndSetRelaxed and + QBasicAtomicPointer<T>::testAndSetRelaxed would previously set the + target to a local stack frame pointer to the new value, rather than to + the new value itself. +Author: William Grant <wgr...@ubuntu.com> + +Index: qt4-x11-4.8.4+dfsg/src/corelib/arch/qatomic_aarch64.h +=================================================================== +--- qt4-x11-4.8.4+dfsg.orig/src/corelib/arch/qatomic_aarch64.h 2013-10-13 22:23:58.000000000 +1100 ++++ qt4-x11-4.8.4+dfsg/src/corelib/arch/qatomic_aarch64.h 2013-10-13 22:24:56.810788571 +1100 +@@ -135,7 +135,7 @@ + bool val; + + Q_COMPILER_MEMORY_BARRIER; +- val = __atomic_compare_exchange_n (&_q_value, &expectedValue, &newValue, ++ val = __atomic_compare_exchange_n (&_q_value, &expectedValue, newValue, + false, __ATOMIC_RELAXED, __ATOMIC_RELAXED); + Q_COMPILER_MEMORY_BARRIER; + return val; +@@ -164,7 +164,7 @@ + { + bool val; + Q_COMPILER_MEMORY_BARRIER; +- val = __atomic_compare_exchange_n (&_q_value, &expectedValue, &newValue, ++ val = __atomic_compare_exchange_n (&_q_value, &expectedValue, newValue, + false, __ATOMIC_RELAXED, __ATOMIC_RELAXED); + Q_COMPILER_MEMORY_BARRIER; + return val; diff -Nru qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/series qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/series --- qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/series 2014-06-16 01:53:44.000000000 +0000 +++ qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/patches/series 2014-08-14 11:20:14.000000000 +0000 @@ -46,3 +46,5 @@ qtdoc-build-offline-docs.patch remove_addsense.patch parisc-atomic.patch +aarch64.patch +aarch64_fix_atomic_set.patch diff -Nru qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/rules qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/rules --- qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/rules 2014-06-26 13:21:22.000000000 +0000 +++ qt4-x11-4.8.6+git49-gbc62005+dfsg/debian/rules 2014-08-15 00:22:03.000000000 +0000 @@ -45,6 +45,10 @@ extra_configure_opts += -no-sql-sqlite2 endif +ifneq (,$(filter $(DEB_HOST_ARCH),arm64)) + extra_configure_opts += -no-javascript-jit +endif + ifeq ($(DEB_HOST_ARCH),arm) extra_configure_opts += -DQT_QLOCALE_USES_FCVT endif @@ -67,7 +71,7 @@ endif ifeq ($(DEB_HOST_ARCH_OS),linux) - ifneq (,$(filter $(DEB_HOST_ARCH),alpha ia64 mips64 mips64el)) + ifneq (,$(filter $(DEB_HOST_ARCH),alpha arm64 ia64 mips64 mips64el)) platform_arg = linux-g++ else ifeq ($(DEB_HOST_ARCH_BITS),64) platform_arg = linux-g++-64