forked from qt-creator/qt-creator
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 <ivan.donchevskii@qt.io>
This commit is contained in:
@@ -27,15 +27,49 @@
|
|||||||
|
|
||||||
#include <clang/Tooling/Tooling.h>
|
#include <clang/Tooling/Tooling.h>
|
||||||
|
|
||||||
#include "clang/Frontend/FrontendActions.h"
|
#include <clang/Frontend/CompilerInstance.h>
|
||||||
|
#include <clang/Frontend/FrontendActions.h>
|
||||||
|
#include <clang/Lex/PreprocessorOptions.h>
|
||||||
|
|
||||||
namespace ClangBackEnd {
|
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<llvm::MemoryBuffer> 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
|
class GeneratePCHActionFactory final : public clang::tooling::FrontendActionFactory
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
GeneratePCHActionFactory(llvm::StringRef filePath, llvm::StringRef fileContent)
|
||||||
|
: m_filePath(filePath)
|
||||||
|
, m_fileContent(fileContent)
|
||||||
|
{}
|
||||||
|
|
||||||
clang::FrontendAction *create() override
|
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
|
} // namespace ClangBackEnd
|
||||||
|
@@ -72,16 +72,20 @@ Utils::SmallString PchCreator::generatePchIncludeFileContent(const FilePathIds &
|
|||||||
return fileContent;
|
return fileContent;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PchCreator::generatePch()
|
bool PchCreator::generatePch(NativeFilePathView path, Utils::SmallStringView content)
|
||||||
{
|
{
|
||||||
clang::tooling::ClangTool tool = m_clangTool.createOutputTool();
|
clang::tooling::ClangTool tool = m_clangTool.createOutputTool();
|
||||||
|
|
||||||
auto action = std::make_unique<GeneratePCHActionFactory>();
|
NativeFilePath headerFilePath{m_environment.pchBuildDirectory().toStdString(), "dummy.h"};
|
||||||
|
|
||||||
|
auto action = std::make_unique<GeneratePCHActionFactory>(llvm::StringRef{path.data(),
|
||||||
|
path.size()},
|
||||||
|
llvm::StringRef{content.data(),
|
||||||
|
content.size()});
|
||||||
|
|
||||||
return tool.run(action.get()) != 1;
|
return tool.run(action.get()) != 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FilePath PchCreator::generatePchFilePath() const
|
FilePath PchCreator::generatePchFilePath() const
|
||||||
{
|
{
|
||||||
std::uniform_int_distribution<std::uint_fast64_t> distribution(
|
std::uniform_int_distribution<std::uint_fast64_t> distribution(
|
||||||
@@ -113,12 +117,10 @@ void PchCreator::generatePch(PchTask &&pchTask)
|
|||||||
auto pchOutputPath = generatePchFilePath();
|
auto pchOutputPath = generatePchFilePath();
|
||||||
|
|
||||||
FilePath headerFilePath{m_environment.pchBuildDirectory().toStdString(), "dummy.h"};
|
FilePath headerFilePath{m_environment.pchBuildDirectory().toStdString(), "dummy.h"};
|
||||||
Utils::SmallStringVector commandLine = generateClangCompilerArguments(pchTask,
|
Utils::SmallStringVector commandLine = generateClangCompilerArguments(pchTask, pchOutputPath);
|
||||||
pchOutputPath);
|
|
||||||
|
|
||||||
m_clangTool.addFile(std::move(headerFilePath), std::move(content), std::move(commandLine));
|
m_clangTool.addFile(std::move(headerFilePath), content.clone(), std::move(commandLine));
|
||||||
|
bool success = generatePch(NativeFilePath{headerFilePath}, content);
|
||||||
bool success = generatePch();
|
|
||||||
|
|
||||||
m_projectPartPch.projectPartId = pchTask.projectPartId();
|
m_projectPartPch.projectPartId = pchTask.projectPartId();
|
||||||
|
|
||||||
|
@@ -81,7 +81,7 @@ public:
|
|||||||
const FilePathCaching &filePathCache();
|
const FilePathCaching &filePathCache();
|
||||||
|
|
||||||
Utils::SmallString generatePchIncludeFileContent(const FilePathIds &includeIds) const;
|
Utils::SmallString generatePchIncludeFileContent(const FilePathIds &includeIds) const;
|
||||||
bool generatePch();
|
bool generatePch(NativeFilePathView path, Utils::SmallStringView content);
|
||||||
|
|
||||||
FilePath generatePchFilePath() const;
|
FilePath generatePchFilePath() const;
|
||||||
static Utils::SmallStringVector generateClangCompilerArguments(const PchTask &pchTask,
|
static Utils::SmallStringVector generateClangCompilerArguments(const PchTask &pchTask,
|
||||||
|
Reference in New Issue
Block a user