From 88bbf4d126dcf2ebf01e48dd98b736a00d9a736c Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 30 Oct 2015 13:30:08 +0100 Subject: [PATCH] ToolChains: Check typeId first before doing expensive checks This should speed up toolchain auto-detection a lot. Change-Id: Id732ed359a4c9de1d49cb658cc91c2e7c9d1b7a6 Reviewed-by: Tobias Hunger --- src/plugins/android/androidtoolchain.cpp | 4 ++-- src/plugins/projectexplorer/gcctoolchain.cpp | 24 +++++++++++++------ .../projectexplorer/gcctoolchainfactories.h | 4 ++-- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index 76b1d7bad3f..1b4177a0b60 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -356,8 +356,8 @@ static AndroidToolChain *findToolChain(Utils::FileName &compilerPath, const QLis { return static_cast( Utils::findOrDefault(alreadyKnown, [compilerPath](ToolChain *tc) { - return tc->compilerCommand() == compilerPath - && tc->typeId() == Constants::ANDROID_TOOLCHAIN_ID; + return tc->typeId() == Constants::ANDROID_TOOLCHAIN_ID + && tc->compilerCommand() == compilerPath; })); } diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 22675549e18..cbec918acdd 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -779,10 +779,13 @@ QList GccToolChainFactory::autoDetect(const QList &alr QList tcs; if (HostOsInfo::isMacHost()) { // Old mac compilers needed to support macx-gccXY mkspecs: - tcs.append(autoDetectToolchains(QLatin1String("g++-4.0"), Abi::hostAbi(), alreadyKnown)); - tcs.append(autoDetectToolchains(QLatin1String("g++-4.2"), Abi::hostAbi(), alreadyKnown)); + tcs.append(autoDetectToolchains(QLatin1String("g++-4.0"), Abi::hostAbi(), + Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown)); + tcs.append(autoDetectToolchains(QLatin1String("g++-4.2"), Abi::hostAbi(), + Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown)); } - tcs.append(autoDetectToolchains(QLatin1String("g++"), Abi::hostAbi(), alreadyKnown)); + tcs.append(autoDetectToolchains(QLatin1String("g++"), Abi::hostAbi(), + Constants::GCC_TOOLCHAIN_TYPEID,alreadyKnown)); return tcs; } @@ -810,6 +813,7 @@ GccToolChain *GccToolChainFactory::createToolChain(bool autoDetect) QList GccToolChainFactory::autoDetectToolchains(const QString &compiler, const Abi &requiredAbi, + const Core::Id requiredTypeId, const QList &alreadyKnown) { QList result; @@ -819,7 +823,10 @@ QList GccToolChainFactory::autoDetectToolchains(const QString &comp if (compilerPath.isEmpty()) return result; - result = Utils::filtered(alreadyKnown, Utils::equal(&ToolChain::compilerCommand, compilerPath)); + result = Utils::filtered(alreadyKnown, [requiredTypeId, compilerPath](ToolChain *tc) { + return tc->typeId() == requiredTypeId + && tc->compilerCommand() == compilerPath; + }); if (!result.isEmpty()) return result; @@ -1114,7 +1121,8 @@ ClangToolChainFactory::ClangToolChainFactory() QList ClangToolChainFactory::autoDetect(const QList &alreadyKnown) { - return autoDetectToolchains(QLatin1String("clang++"), Abi::hostAbi(), alreadyKnown); + return autoDetectToolchains(QLatin1String("clang++"), Abi::hostAbi(), + Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown); } bool ClangToolChainFactory::canRestore(const QVariantMap &data) @@ -1194,7 +1202,8 @@ QList MingwToolChainFactory::autoDetect(const QList &a { Abi ha = Abi::hostAbi(); ha = Abi(ha.architecture(), Abi::WindowsOS, Abi::WindowsMSysFlavor, Abi::PEFormat, ha.wordWidth()); - return autoDetectToolchains(QLatin1String("g++"), ha, alreadyKnown); + return autoDetectToolchains(QLatin1String("g++"), ha, + Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); } bool MingwToolChainFactory::canRestore(const QVariantMap &data) @@ -1269,7 +1278,8 @@ LinuxIccToolChainFactory::LinuxIccToolChainFactory() QList LinuxIccToolChainFactory::autoDetect(const QList &alreadyKnown) { - return autoDetectToolchains(QLatin1String("icpc"), Abi::hostAbi(), alreadyKnown); + return autoDetectToolchains(QLatin1String("icpc"), Abi::hostAbi(), + Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown); } bool LinuxIccToolChainFactory::canRestore(const QVariantMap &data) diff --git a/src/plugins/projectexplorer/gcctoolchainfactories.h b/src/plugins/projectexplorer/gcctoolchainfactories.h index c0532706520..cee36b3b2ce 100644 --- a/src/plugins/projectexplorer/gcctoolchainfactories.h +++ b/src/plugins/projectexplorer/gcctoolchainfactories.h @@ -66,8 +66,8 @@ public: protected: virtual GccToolChain *createToolChain(bool autoDetect); - QList autoDetectToolchains(const QString &compiler, - const Abi &, + QList autoDetectToolchains(const QString &compiler, const Abi &requiredAbi, + const Core::Id requiredTypeId, const QList &alreadyKnown); };