aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2016-12-12 13:10:33 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2016-12-19 15:07:34 +0000
commit21e82bbbe316f582ee11c8996e24e402f9342606 (patch)
treedf3ac27e814e83f0cf914944bcf3f354fad64638 /src/lib/corelib
parentd3b1bf682181277e03299b1567631e144df12a67 (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.cpp8
-rw-r--r--src/lib/corelib/buildgraph/depscanner.h6
-rw-r--r--src/lib/corelib/buildgraph/inputartifactscanner.cpp25
-rw-r--r--src/lib/corelib/buildgraph/inputartifactscanner.h3
-rw-r--r--src/lib/corelib/buildgraph/qtmocscanner.cpp4
-rw-r--r--src/lib/corelib/tools/scannerpluginmanager.cpp8
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)