[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#735488: qt4-x11: Add arm64 support



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 <wookey@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 <wgrant@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

Reply to: