From 406336bab74fe8ed300420bdcc232dd0867b8753 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Mon, 11 Feb 2019 17:17:06 +0100 Subject: [PATCH] ClangRefactoring: Fix PCH build We have to generate a PCH which is not checked by size or data. For that we have to remap the file so it get the overridden flag. If that flat is set no checks will be performed. Task-number: QTCREATORBUG-21958 Change-Id: Id9bff91b3ab64526dc109eb46d4a21766456abe5 Reviewed-by: Ivan Donchevskii --- .../source/generatepchactionfactory.h | 38 ++++++++++++++++++- .../source/pchcreator.cpp | 18 +++++---- .../source/pchcreator.h | 2 +- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/tools/clangpchmanagerbackend/source/generatepchactionfactory.h b/src/tools/clangpchmanagerbackend/source/generatepchactionfactory.h index 47a64eda929..50061a9e6cb 100644 --- a/src/tools/clangpchmanagerbackend/source/generatepchactionfactory.h +++ b/src/tools/clangpchmanagerbackend/source/generatepchactionfactory.h @@ -27,15 +27,49 @@ #include -#include "clang/Frontend/FrontendActions.h" +#include +#include +#include namespace ClangBackEnd { + +class GeneratePCHAction final : public clang::GeneratePCHAction +{ +public: + GeneratePCHAction(llvm::StringRef filePath, llvm::StringRef fileContent) + : m_filePath(filePath) + , m_fileContent(fileContent) + {} + + bool BeginInvocation(clang::CompilerInstance &compilerInstance) override + { + compilerInstance.getPreprocessorOpts().DisablePCHValidation = true; + std::unique_ptr Input = llvm::MemoryBuffer::getMemBuffer(m_fileContent); + compilerInstance.getPreprocessorOpts().addRemappedFile(m_filePath, Input.release()); + + return clang::GeneratePCHAction::BeginSourceFileAction(compilerInstance); + } + +private: + llvm::StringRef m_filePath; + llvm::StringRef m_fileContent; +}; + class GeneratePCHActionFactory final : public clang::tooling::FrontendActionFactory { public: + GeneratePCHActionFactory(llvm::StringRef filePath, llvm::StringRef fileContent) + : m_filePath(filePath) + , m_fileContent(fileContent) + {} + clang::FrontendAction *create() override { - return new clang::GeneratePCHAction; + return new GeneratePCHAction{m_filePath, m_fileContent}; } + +private: + llvm::StringRef m_filePath; + llvm::StringRef m_fileContent; }; } // namespace ClangBackEnd diff --git a/src/tools/clangpchmanagerbackend/source/pchcreator.cpp b/src/tools/clangpchmanagerbackend/source/pchcreator.cpp index 845c92412a4..f4a10053622 100644 --- a/src/tools/clangpchmanagerbackend/source/pchcreator.cpp +++ b/src/tools/clangpchmanagerbackend/source/pchcreator.cpp @@ -72,16 +72,20 @@ Utils::SmallString PchCreator::generatePchIncludeFileContent(const FilePathIds & return fileContent; } -bool PchCreator::generatePch() +bool PchCreator::generatePch(NativeFilePathView path, Utils::SmallStringView content) { clang::tooling::ClangTool tool = m_clangTool.createOutputTool(); - auto action = std::make_unique(); + NativeFilePath headerFilePath{m_environment.pchBuildDirectory().toStdString(), "dummy.h"}; + + auto action = std::make_unique(llvm::StringRef{path.data(), + path.size()}, + llvm::StringRef{content.data(), + content.size()}); return tool.run(action.get()) != 1; } - FilePath PchCreator::generatePchFilePath() const { std::uniform_int_distribution distribution( @@ -113,12 +117,10 @@ void PchCreator::generatePch(PchTask &&pchTask) auto pchOutputPath = generatePchFilePath(); FilePath headerFilePath{m_environment.pchBuildDirectory().toStdString(), "dummy.h"}; - Utils::SmallStringVector commandLine = generateClangCompilerArguments(pchTask, - pchOutputPath); + Utils::SmallStringVector commandLine = generateClangCompilerArguments(pchTask, pchOutputPath); - m_clangTool.addFile(std::move(headerFilePath), std::move(content), std::move(commandLine)); - - bool success = generatePch(); + m_clangTool.addFile(std::move(headerFilePath), content.clone(), std::move(commandLine)); + bool success = generatePch(NativeFilePath{headerFilePath}, content); m_projectPartPch.projectPartId = pchTask.projectPartId(); diff --git a/src/tools/clangpchmanagerbackend/source/pchcreator.h b/src/tools/clangpchmanagerbackend/source/pchcreator.h index 6e889ab5657..b2c0c309e77 100644 --- a/src/tools/clangpchmanagerbackend/source/pchcreator.h +++ b/src/tools/clangpchmanagerbackend/source/pchcreator.h @@ -81,7 +81,7 @@ public: const FilePathCaching &filePathCache(); Utils::SmallString generatePchIncludeFileContent(const FilePathIds &includeIds) const; - bool generatePch(); + bool generatePch(NativeFilePathView path, Utils::SmallStringView content); FilePath generatePchFilePath() const; static Utils::SmallStringVector generateClangCompilerArguments(const PchTask &pchTask,