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,