summaryrefslogtreecommitdiff
path: root/src/tools/clangpchmanagerbackend
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2019-02-19 09:08:53 +0100
committerEike Ziller <eike.ziller@qt.io>2019-02-19 09:08:53 +0100
commit6d43aaf1340bc7b2ac52798707947baacb76d34d (patch)
tree12d39921f7876ea36c0ff45dd4555a986ecb1934 /src/tools/clangpchmanagerbackend
parentbfa53a8080b49b1fc16282aa5e28469e4fbd9224 (diff)
parent29492ecf2494d875e3e2fa4951326aed275a3033 (diff)
downloadqt-creator-6d43aaf1340bc7b2ac52798707947baacb76d34d.tar.gz
Merge remote-tracking branch 'origin/4.9'
Change-Id: I7bdb6a4658c5fca1a7e1dda5adbb5613dabc6d18
Diffstat (limited to 'src/tools/clangpchmanagerbackend')
-rw-r--r--src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp9
-rw-r--r--src/tools/clangpchmanagerbackend/source/generatepchactionfactory.h4
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchcreator.cpp21
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchcreator.h1
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtaskgenerator.cpp6
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtaskgenerator.h8
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp5
-rw-r--r--src/tools/clangpchmanagerbackend/source/usedmacrofilter.h9
8 files changed, 50 insertions, 13 deletions
diff --git a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp
index 58d749ec3a..f4afaf9210 100644
--- a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp
+++ b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp
@@ -246,8 +246,13 @@ struct Data // because we have a cycle dependency
modifiedTimeChecker,
buildDependencyCollector,
database};
- ClangBackEnd::PchTaskGenerator pchTaskGenerator{buildDependencyProvider, pchTaskMerger};
- PchManagerServer clangPchManagerServer{includeWatcher, pchTaskGenerator, projectParts, generatedFiles};
+ ClangBackEnd::PchTaskGenerator pchTaskGenerator{buildDependencyProvider,
+ pchTaskMerger,
+ progressCounter};
+ PchManagerServer clangPchManagerServer{includeWatcher,
+ pchTaskGenerator,
+ projectParts,
+ generatedFiles};
TaskScheduler systemTaskScheduler{pchCreatorManager,
pchTaskQueue,
progressCounter,
diff --git a/src/tools/clangpchmanagerbackend/source/generatepchactionfactory.h b/src/tools/clangpchmanagerbackend/source/generatepchactionfactory.h
index 50061a9e6c..2b1f4d036d 100644
--- a/src/tools/clangpchmanagerbackend/source/generatepchactionfactory.h
+++ b/src/tools/clangpchmanagerbackend/source/generatepchactionfactory.h
@@ -27,6 +27,7 @@
#include <clang/Tooling/Tooling.h>
+#include <clang/Basic/DiagnosticOptions.h>
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/FrontendActions.h>
#include <clang/Lex/PreprocessorOptions.h>
@@ -44,6 +45,9 @@ public:
bool BeginInvocation(clang::CompilerInstance &compilerInstance) override
{
compilerInstance.getPreprocessorOpts().DisablePCHValidation = true;
+ compilerInstance.getPreprocessorOpts().AllowPCHWithCompilerErrors = true;
+ compilerInstance.getLangOpts().DelayedTemplateParsing = true;
+ compilerInstance.getDiagnosticOpts().ErrorLimit = 0;
std::unique_ptr<llvm::MemoryBuffer> Input = llvm::MemoryBuffer::getMemBuffer(m_fileContent);
compilerInstance.getPreprocessorOpts().addRemappedFile(m_filePath, Input.release());
diff --git a/src/tools/clangpchmanagerbackend/source/pchcreator.cpp b/src/tools/clangpchmanagerbackend/source/pchcreator.cpp
index f4a1005362..b8227ce964 100644
--- a/src/tools/clangpchmanagerbackend/source/pchcreator.cpp
+++ b/src/tools/clangpchmanagerbackend/source/pchcreator.cpp
@@ -76,8 +76,6 @@ bool PchCreator::generatePch(NativeFilePathView path, Utils::SmallStringView con
{
clang::tooling::ClangTool tool = m_clangTool.createOutputTool();
- NativeFilePath headerFilePath{m_environment.pchBuildDirectory().toStdString(), "dummy.h"};
-
auto action = std::make_unique<GeneratePCHActionFactory>(llvm::StringRef{path.data(),
path.size()},
llvm::StringRef{content.data(),
@@ -138,6 +136,16 @@ const ProjectPartPch &PchCreator::projectPartPch()
void PchCreator::setUnsavedFiles(const V2::FileContainers &fileContainers)
{
+ m_generatedFilePathIds.clear();
+ m_generatedFilePathIds.reserve(fileContainers.size());
+ std::transform(fileContainers.begin(),
+ fileContainers.end(),
+ std::back_inserter(m_generatedFilePathIds),
+ [&](const V2::FileContainer &fileContainer) {
+ return m_filePathCache.filePathId(fileContainer.filePath);
+ });
+ std::sort(m_generatedFilePathIds.begin(), m_generatedFilePathIds.end());
+
m_clangTool.addUnsavedFiles(fileContainers);
}
@@ -159,7 +167,14 @@ void PchCreator::clear()
void PchCreator::doInMainThreadAfterFinished()
{
- m_clangPathwatcher.updateIdPaths({{m_projectPartPch.projectPartId, m_allInclues}});
+ FilePathIds existingIncludes;
+ existingIncludes.reserve(m_allInclues.size());
+ std::set_difference(m_allInclues.begin(),
+ m_allInclues.end(),
+ m_generatedFilePathIds.begin(),
+ m_generatedFilePathIds.end(),
+ std::back_inserter(existingIncludes));
+ m_clangPathwatcher.updateIdPaths({{m_projectPartPch.projectPartId, existingIncludes}});
m_pchManagerClient.precompiledHeadersUpdated(ProjectPartPchs{m_projectPartPch});
}
diff --git a/src/tools/clangpchmanagerbackend/source/pchcreator.h b/src/tools/clangpchmanagerbackend/source/pchcreator.h
index b2c0c309e7..7c736dd234 100644
--- a/src/tools/clangpchmanagerbackend/source/pchcreator.h
+++ b/src/tools/clangpchmanagerbackend/source/pchcreator.h
@@ -98,6 +98,7 @@ private:
ProjectPartPch m_projectPartPch;
FilePathCaching m_filePathCache;
FilePathIds m_allInclues;
+ FilePathIds m_generatedFilePathIds;
Environment &m_environment;
PchManagerClientInterface &m_pchManagerClient;
ClangPathWatcherInterface &m_clangPathwatcher;
diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.cpp b/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.cpp
index 82584ad1dd..aab3bfe7d4 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.cpp
+++ b/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.cpp
@@ -27,9 +27,10 @@
#include "builddependenciesproviderinterface.h"
#include "pchtasksmergerinterface.h"
-
#include "usedmacrofilter.h"
+#include <progresscounter.h>
+
#include <utils/algorithm.h>
namespace ClangBackEnd {
@@ -40,6 +41,8 @@ void PchTaskGenerator::addProjectParts(ProjectPartContainers &&projectParts,
PchTaskSets pchTaskSets;
pchTaskSets.reserve(projectParts.size());
+ m_progressCounter.addTotal(static_cast<int>(projectParts.size()));
+
for (auto &projectPart : projectParts) {
BuildDependency buildDependency = m_buildDependenciesProvider.create(projectPart);
UsedMacroFilter filter{buildDependency.includes,
@@ -68,6 +71,7 @@ void PchTaskGenerator::addProjectParts(ProjectPartContainers &&projectParts,
projectPart.language,
projectPart.languageVersion,
projectPart.languageExtension});
+ m_progressCounter.addProgress(1);
}
m_pchTasksMergerInterface.mergeTasks(std::move(pchTaskSets), std::move(toolChainArguments));
diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.h b/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.h
index b5669b7b3f..38376ce2a2 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.h
+++ b/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.h
@@ -35,14 +35,18 @@ namespace ClangBackEnd {
class PchTasksMergerInterface;
class BuildDependenciesProviderInterface;
+class ProgressCounter;
class PchTaskGenerator : public PchTaskGeneratorInterface
{
public:
PchTaskGenerator(BuildDependenciesProviderInterface &buildDependenciesProvider,
- PchTasksMergerInterface &pchTasksMergerInterface)
+ PchTasksMergerInterface &pchTasksMergerInterface,
+ ProgressCounter &progressCounter)
: m_buildDependenciesProvider(buildDependenciesProvider)
, m_pchTasksMergerInterface(pchTasksMergerInterface)
+ , m_progressCounter(progressCounter)
+
{}
void addProjectParts(ProjectPartContainers &&projectParts,
@@ -52,7 +56,7 @@ public:
private:
BuildDependenciesProviderInterface &m_buildDependenciesProvider;
PchTasksMergerInterface &m_pchTasksMergerInterface;
+ ProgressCounter &m_progressCounter;
};
-
} // namespace ClangBackEnd
diff --git a/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp b/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp
index 636d9a3236..50851a838a 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp
+++ b/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp
@@ -71,7 +71,7 @@ bool PchTasksMerger::hasDuplicates(const CompilerMacros &compilerMacros)
return first.key == second.key;
});
- return found == compilerMacros.end();
+ return found != compilerMacros.end();
}
IncludeSearchPaths mergeIncludeSearchPaths(IncludeSearchPaths &&first, IncludeSearchPaths &&second)
@@ -89,7 +89,8 @@ bool PchTasksMerger::mergePchTasks(PchTask &firstTask, PchTask &secondTask)
CompilerMacros macros = mergeMacros(firstTask.compilerMacros, secondTask.compilerMacros);
- secondTask.isMerged = hasDuplicates(macros);
+ secondTask.isMerged = !hasDuplicates(macros);
+
if (secondTask.isMerged && firstTask.language == secondTask.language) {
firstTask.projectPartIds = merge(std::move(firstTask.projectPartIds),
diff --git a/src/tools/clangpchmanagerbackend/source/usedmacrofilter.h b/src/tools/clangpchmanagerbackend/source/usedmacrofilter.h
index 0b39ae1f4f..fe08cf71ac 100644
--- a/src/tools/clangpchmanagerbackend/source/usedmacrofilter.h
+++ b/src/tools/clangpchmanagerbackend/source/usedmacrofilter.h
@@ -93,8 +93,8 @@ public:
return std::tie(first.key, first.value) < std::tie(second.key, second.value);
});
- systemCompilerMacros = filtercompilerMacros(indexedCompilerMacro, systemUsedMacros);
- projectCompilerMacros = filtercompilerMacros(indexedCompilerMacro, projectUsedMacros);
+ systemCompilerMacros = filterCompilerMacros(indexedCompilerMacro, systemUsedMacros);
+ projectCompilerMacros = filterCompilerMacros(indexedCompilerMacro, projectUsedMacros);
}
private:
@@ -150,10 +150,13 @@ private:
std::sort(filtertedMacros.begin(), filtertedMacros.end());
+ auto newEnd = std::unique(filtertedMacros.begin(), filtertedMacros.end());
+ filtertedMacros.erase(newEnd, filtertedMacros.end());
+
return filtertedMacros;
}
- static CompilerMacros filtercompilerMacros(const CompilerMacros &indexedCompilerMacro,
+ static CompilerMacros filterCompilerMacros(const CompilerMacros &indexedCompilerMacro,
const Utils::SmallStringVector &usedMacros)
{
CompilerMacros filtertedCompilerMacros;