aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-04-24 12:55:58 +0800
committerTim Blechmann <tim@klingt.org>2024-04-30 13:37:53 +0000
commit88988c900d9bca3967816f8a3d0e30bf4178ed0f (patch)
tree9da3911569bb77fccb5f626021c3e7310afb622b
parent4949768067cfc8a16c0cef958928e94147842bb8 (diff)
QmlCompiler: fix unity builds
`deduplicate` was declared in two translation units, which is breaking unity builds. Moving the definition to QQmlJSUtils fixes the builds and makes the code more robust towards potential ODR violations in case the function is ever changed in one TU, but not in the other. Change-Id: I57627399d50d284ce031af245fd4ad5aa1ab6405 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r--src/qmlcompiler/qqmljsbasicblocks.cpp12
-rw-r--r--src/qmlcompiler/qqmljsoptimizations.cpp13
-rw-r--r--src/qmlcompiler/qqmljsutils_p.h8
3 files changed, 13 insertions, 20 deletions
diff --git a/src/qmlcompiler/qqmljsbasicblocks.cpp b/src/qmlcompiler/qqmljsbasicblocks.cpp
index 671cac0d25..392a8b9ba7 100644
--- a/src/qmlcompiler/qqmljsbasicblocks.cpp
+++ b/src/qmlcompiler/qqmljsbasicblocks.cpp
@@ -2,6 +2,7 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "qqmljsbasicblocks_p.h"
+#include "qqmljsutils_p.h"
#include <QtQml/private/qv4instr_moth_p.h>
@@ -101,15 +102,6 @@ void QQmlJSBasicBlocks::dumpDOTGraph()
}
}
-template<typename Container>
-void deduplicate(Container &container)
-{
- std::sort(container.begin(), container.end());
- auto erase = std::unique(container.begin(), container.end());
- container.erase(erase, container.end());
-}
-
-
QQmlJSCompilePass::BlocksAndAnnotations
QQmlJSBasicBlocks::run(const Function *function, QQmlJSAotCompiler::Flags compileFlags,
bool &basicBlocksValidationFailed)
@@ -156,7 +148,7 @@ QQmlJSBasicBlocks::run(const Function *function, QQmlJSAotCompiler::Flags compil
reset();
decode(byteCode.constData(), static_cast<uint>(byteCode.size()));
for (auto it = m_basicBlocks.begin(), end = m_basicBlocks.end(); it != end; ++it)
- deduplicate(it->second.jumpOrigins);
+ QQmlJSUtils::deduplicate(it->second.jumpOrigins);
}
if (compileFlags.testFlag(QQmlJSAotCompiler::ValidateBasicBlocks) || qv4ValidateBasicBlocks()) {
diff --git a/src/qmlcompiler/qqmljsoptimizations.cpp b/src/qmlcompiler/qqmljsoptimizations.cpp
index ecef117c53..1d0a7cf415 100644
--- a/src/qmlcompiler/qqmljsoptimizations.cpp
+++ b/src/qmlcompiler/qqmljsoptimizations.cpp
@@ -3,6 +3,7 @@
#include "qqmljsoptimizations_p.h"
#include "qqmljsbasicblocks_p.h"
+#include "qqmljsutils_p.h"
QT_BEGIN_NAMESPACE
@@ -28,14 +29,6 @@ struct PendingBlock
bool registerActive = false;
};
-template <typename Container>
-void deduplicate(Container &container)
-{
- std::sort(container.begin(), container.end());
- auto erase = std::unique(container.begin(), container.end());
- container.erase(erase, container.end());
-}
-
template<typename ContainerA, typename ContainerB>
static bool containsAny(const ContainerA &container, const ContainerB &elements)
{
@@ -529,8 +522,8 @@ void QQmlJSOptimizations::populateBasicBlocks()
}
}
- deduplicate(block.readTypes);
- deduplicate(block.readRegisters);
+ QQmlJSUtils::deduplicate(block.readTypes);
+ QQmlJSUtils::deduplicate(block.readRegisters);
}
}
diff --git a/src/qmlcompiler/qqmljsutils_p.h b/src/qmlcompiler/qqmljsutils_p.h
index 9eb6840f9d..eaa834bec9 100644
--- a/src/qmlcompiler/qqmljsutils_p.h
+++ b/src/qmlcompiler/qqmljsutils_p.h
@@ -364,6 +364,14 @@ struct Q_QMLCOMPILER_EXPORT QQmlJSUtils
static std::variant<QString, QQmlJS::DiagnosticMessage>
sourceDirectoryPath(const QQmlJSImporter *importer, const QString &buildDirectoryPath);
+
+ template <typename Container>
+ static void deduplicate(Container &container)
+ {
+ std::sort(container.begin(), container.end());
+ auto erase = std::unique(container.begin(), container.end());
+ container.erase(erase, container.end());
+ }
};
bool Q_QMLCOMPILER_EXPORT canStrictlyCompareWithVar(