diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2016-12-12 13:10:33 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2016-12-19 15:07:34 +0000 |
commit | 21e82bbbe316f582ee11c8996e24e402f9342606 (patch) | |
tree | df3ac27e814e83f0cf914944bcf3f354fad64638 /src/lib/corelib | |
parent | d3b1bf682181277e03299b1567631e144df12a67 (diff) |
Merge the C/C++ include scanners
We had one scanner for every type of file in the C family, all of which
collected the same set of includes, but under a different entry in the
scanner cache. Thus, lots of header files were unnecessarily re-scanned.
We fix this by making the scanner plugins declare a *list* of tags they
can handle and passing the currently active tags in the open() function.
========== Performance data for Rule Execution ==========
Old instruction count: 3775190973
New instruction count: 3441085735
Relative change: -9 %
Old peak memory usage: 18174216 Bytes
New peak memory usage: 17307600 Bytes
Relative change: -5 %
Change-Id: I222d1ec4bbfbc06ecd8c81faa55a500bc0da1ee6
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/lib/corelib')
-rw-r--r-- | src/lib/corelib/buildgraph/depscanner.cpp | 8 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/depscanner.h | 6 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/inputartifactscanner.cpp | 25 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/inputartifactscanner.h | 3 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/qtmocscanner.cpp | 4 | ||||
-rw-r--r-- | src/lib/corelib/tools/scannerpluginmanager.cpp | 8 |
6 files changed, 35 insertions, 19 deletions
diff --git a/src/lib/corelib/buildgraph/depscanner.cpp b/src/lib/corelib/buildgraph/depscanner.cpp index d88759f3b..824c3cf75 100644 --- a/src/lib/corelib/buildgraph/depscanner.cpp +++ b/src/lib/corelib/buildgraph/depscanner.cpp @@ -88,12 +88,13 @@ QStringList PluginDependencyScanner::collectSearchPaths(Artifact *artifact) } } -QStringList PluginDependencyScanner::collectDependencies(FileResourceBase *file) +QStringList PluginDependencyScanner::collectDependencies(FileResourceBase *file, + const char *fileTags) { QSet<QString> result; QString baseDirOfInFilePath = file->dirPath(); const QString &filepath = file->filePath(); - void *scannerHandle = m_plugin->open(filepath.utf16(), ScanForDependenciesFlag); + void *scannerHandle = m_plugin->open(filepath.utf16(), fileTags, ScanForDependenciesFlag); if (!scannerHandle) return QStringList(); forever { @@ -150,8 +151,9 @@ QStringList UserDependencyScanner::collectSearchPaths(Artifact *artifact) return evaluate(artifact, m_scanner->searchPathsScript); } -QStringList UserDependencyScanner::collectDependencies(FileResourceBase *file) +QStringList UserDependencyScanner::collectDependencies(FileResourceBase *file, const char *fileTags) { + Q_UNUSED(fileTags); // ### support user dependency scanners for file deps Artifact *artifact = dynamic_cast<Artifact *>(file); if (!artifact) diff --git a/src/lib/corelib/buildgraph/depscanner.h b/src/lib/corelib/buildgraph/depscanner.h index 342d88b3c..e0fe52028 100644 --- a/src/lib/corelib/buildgraph/depscanner.h +++ b/src/lib/corelib/buildgraph/depscanner.h @@ -63,7 +63,7 @@ public: virtual ~DependencyScanner() {} virtual QStringList collectSearchPaths(Artifact *artifact) = 0; - virtual QStringList collectDependencies(FileResourceBase *file) = 0; + virtual QStringList collectDependencies(FileResourceBase *file, const char *fileTags) = 0; virtual bool recursive() const = 0; virtual const void *key() const = 0; }; @@ -75,7 +75,7 @@ public: private: QStringList collectSearchPaths(Artifact *artifact); - QStringList collectDependencies(FileResourceBase *file); + QStringList collectDependencies(FileResourceBase *file, const char *fileTags); bool recursive() const; const void *key() const; @@ -90,7 +90,7 @@ public: private: QStringList collectSearchPaths(Artifact *artifact); - QStringList collectDependencies(FileResourceBase *file); + QStringList collectDependencies(FileResourceBase *file, const char *fileTags); bool recursive() const; const void *key() const; diff --git a/src/lib/corelib/buildgraph/inputartifactscanner.cpp b/src/lib/corelib/buildgraph/inputartifactscanner.cpp index 560ac0a9f..882b9627c 100644 --- a/src/lib/corelib/buildgraph/inputartifactscanner.cpp +++ b/src/lib/corelib/buildgraph/inputartifactscanner.cpp @@ -115,16 +115,6 @@ static void resolveDepencency(const ScanResultCache::Dependency &dependency, result->filePath = absFilePath; } -static void scanWithScannerPlugin(DependencyScanner *scanner, - FileResourceBase *fileToBeScanned, - ScanResultCache::Result *scanResult) -{ - QStringList dependencies = scanner->collectDependencies(fileToBeScanned); - foreach (const QString &s, dependencies) - scanResult->deps += ScanResultCache::Dependency(s); - scanResult->valid = true; -} - InputArtifactScanner::InputArtifactScanner(Artifact *artifact, InputArtifactScannerContext *ctx, const Logger &logger) : m_artifact(artifact), m_context(ctx), m_newDependencyAdded(false), m_logger(logger) @@ -176,6 +166,10 @@ void InputArtifactScanner::scanForFileDependencies(Artifact *inputArtifact) QList<FileResourceBase *> filesToScan; filesToScan.append(inputArtifact); const QSet<DependencyScanner *> scanners = scannersForArtifact(inputArtifact); + if (scanners.isEmpty()) + return; + m_fileTagsForScanner = inputArtifact->fileTags().toStringList().join(QLatin1Char(',')) + .toLatin1().constData(); while (!filesToScan.isEmpty()) { FileResourceBase *fileToBeScanned = filesToScan.takeFirst(); const QString &filePathToBeScanned = fileToBeScanned->filePath(); @@ -364,6 +358,17 @@ void InputArtifactScanner::handleDependency(ResolvedDependency &dependency) } } +void InputArtifactScanner::scanWithScannerPlugin(DependencyScanner *scanner, + FileResourceBase *fileToBeScanned, + ScanResultCache::Result *scanResult) +{ + const QStringList &dependencies + = scanner->collectDependencies(fileToBeScanned, m_fileTagsForScanner); + for (const QString &s : dependencies) + scanResult->deps += ScanResultCache::Dependency(s); + scanResult->valid = true; +} + InputArtifactScannerContext::DependencyScannerCacheItem::DependencyScannerCacheItem() : valid(false) { } diff --git a/src/lib/corelib/buildgraph/inputartifactscanner.h b/src/lib/corelib/buildgraph/inputartifactscanner.h index 62f976d5d..39304879c 100644 --- a/src/lib/corelib/buildgraph/inputartifactscanner.h +++ b/src/lib/corelib/buildgraph/inputartifactscanner.h @@ -140,9 +140,12 @@ private: const ScanResultCache::Result &scanResult, QList<FileResourceBase *> *artifactsToScan, InputArtifactScannerContext::ScannerResolvedDependenciesCache &cache); void handleDependency(ResolvedDependency &dependency); + void scanWithScannerPlugin(DependencyScanner *scanner, FileResourceBase *fileToBeScanned, + ScanResultCache::Result *scanResult); Artifact * const m_artifact; InputArtifactScannerContext *const m_context; + const char *m_fileTagsForScanner; bool m_newDependencyAdded; Logger m_logger; }; diff --git a/src/lib/corelib/buildgraph/qtmocscanner.cpp b/src/lib/corelib/buildgraph/qtmocscanner.cpp index be133630b..fc0e54d77 100644 --- a/src/lib/corelib/buildgraph/qtmocscanner.cpp +++ b/src/lib/corelib/buildgraph/qtmocscanner.cpp @@ -92,7 +92,9 @@ static ScanResultCache::Result runScanner(ScannerPlugin *scanner, const Artifact ScanResultCache::Result scanResult = scanResultCache->value(scanner, filepath); if (!scanResult.valid) { scanResult.valid = true; - void *opaq = scanner->open(filepath.utf16(), + const char * const tagsForScanner + = artifact->fileTags().toStringList().join(QLatin1Char(',')).toLatin1().constData(); + void *opaq = scanner->open(filepath.utf16(), tagsForScanner, ScanForDependenciesFlag | ScanForFileTagsFlag); if (!opaq || !scanner->additionalFileTags) return scanResult; diff --git a/src/lib/corelib/tools/scannerpluginmanager.cpp b/src/lib/corelib/tools/scannerpluginmanager.cpp index 12e38c1de..883eb7c56 100644 --- a/src/lib/corelib/tools/scannerpluginmanager.cpp +++ b/src/lib/corelib/tools/scannerpluginmanager.cpp @@ -75,8 +75,12 @@ QList<ScannerPlugin *> ScannerPluginManager::scannersForFileTag(const FileTag &f void ScannerPluginManager::loadPlugins(ScannerPlugin **plugins) { - for (int i = 0; plugins[i] != 0; ++i) - m_scannerPlugins[FileTag(plugins[i]->fileTag)] += plugins[i]; + for (int i = 0; plugins[i] != 0; ++i) { + const FileTags &fileTags = FileTags::fromStringList( + QString::fromLatin1(plugins[i]->fileTags).split(QLatin1Char(','))); + for (const FileTag &tag : fileTags) + m_scannerPlugins[tag] += plugins[i]; + } } void ScannerPluginManager::loadPlugins(const QStringList &pluginPaths, const Logger &logger) |