diff options
author | Eike Ziller <eike.ziller@qt.io> | 2019-02-19 09:08:53 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2019-02-19 09:08:53 +0100 |
commit | 6d43aaf1340bc7b2ac52798707947baacb76d34d (patch) | |
tree | 12d39921f7876ea36c0ff45dd4555a986ecb1934 /src/tools/clangpchmanagerbackend | |
parent | bfa53a8080b49b1fc16282aa5e28469e4fbd9224 (diff) | |
parent | 29492ecf2494d875e3e2fa4951326aed275a3033 (diff) | |
download | qt-creator-6d43aaf1340bc7b2ac52798707947baacb76d34d.tar.gz |
Merge remote-tracking branch 'origin/4.9'
Change-Id: I7bdb6a4658c5fca1a7e1dda5adbb5613dabc6d18
Diffstat (limited to 'src/tools/clangpchmanagerbackend')
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; |