diff options
Diffstat (limited to 'src/corelib/plugin/qlibrary_unix.cpp')
-rw-r--r-- | src/corelib/plugin/qlibrary_unix.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/corelib/plugin/qlibrary_unix.cpp b/src/corelib/plugin/qlibrary_unix.cpp index 23b9ad6434..e03814984c 100644 --- a/src/corelib/plugin/qlibrary_unix.cpp +++ b/src/corelib/plugin/qlibrary_unix.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 Intel Corporation ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -43,6 +44,7 @@ #include "qlibrary_p.h" #include <qcoreapplication.h> #include <private/qfilesystementry_p.h> +#include <private/qsimd_p.h> #include <dlfcn.h> @@ -155,7 +157,7 @@ bool QLibraryPrivate::load_sys() // Do not unload the library during dlclose(). Consequently, the // library's specific static variables are not reinitialized if the // library is reloaded with dlopen() at a later time. -#ifdef RTLD_NODELETE +#if defined(RTLD_NODELETE) && !defined(Q_OS_ANDROID) if (loadHints & QLibrary::PreventUnloadHint) { dlFlags |= RTLD_NODELETE; } @@ -178,6 +180,29 @@ bool QLibraryPrivate::load_sys() prefixes.append(QString()); } +#if defined(Q_PROCESSOR_X86) && !defined(Q_OS_DARWIN) + if (qCpuHasFeature(ArchHaswell)) { + auto transform = [](QStringList &list, void (*f)(QString *)) { + QStringList tmp; + qSwap(tmp, list); + list.reserve(tmp.size() * 2); + for (const QString &s : qAsConst(tmp)) { + QString modifiedPath = s; + f(&modifiedPath); + list.append(modifiedPath); + list.append(s); + } + }; + if (pluginState == IsAPlugin) { + // add ".avx2" to each suffix in the list + transform(suffixes, [](QString *s) { s->append(QLatin1String(".avx2")); }); + } else { + // prepend "haswell/" to each prefix in the list + transform(prefixes, [](QString *s) { s->prepend(QLatin1String("haswell/")); }); + } + } +#endif + bool retry = true; for(int prefix = 0; retry && !pHnd && prefix < prefixes.size(); prefix++) { for(int suffix = 0; retry && !pHnd && suffix < suffixes.size(); suffix++) { |