mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 11:35:51 -04:00

Summary: This improves performance of code completion, because we avoid stating the files from the preamble and never attempt to parse the files without using the preamble if it's provided. However, the change comes at a cost of sometimes providing incorrect results when doing code completion after making actually considerable changes to the files used in the preamble or the preamble itself. Eventually the preamble will get rebuilt and code completion will be providing the correct results. Reviewers: bkramer, sammccall, jkorous-apple Reviewed By: sammccall Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D41991 llvm-svn: 322854
60 lines
2.1 KiB
C++
60 lines
2.1 KiB
C++
//===--- Compiler.cpp -------------------------------------------*- C++-*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===---------------------------------------------------------------------===//
|
|
|
|
#include "Compiler.h"
|
|
#include "clang/Basic/TargetInfo.h"
|
|
#include "clang/Lex/PreprocessorOptions.h"
|
|
|
|
namespace clang {
|
|
namespace clangd {
|
|
|
|
std::unique_ptr<CompilerInstance>
|
|
prepareCompilerInstance(std::unique_ptr<clang::CompilerInvocation> CI,
|
|
const PrecompiledPreamble *Preamble,
|
|
std::unique_ptr<llvm::MemoryBuffer> Buffer,
|
|
std::shared_ptr<PCHContainerOperations> PCHs,
|
|
IntrusiveRefCntPtr<vfs::FileSystem> VFS,
|
|
DiagnosticConsumer &DiagsClient) {
|
|
assert(VFS && "VFS is null");
|
|
assert(!CI->getPreprocessorOpts().RetainRemappedFileBuffers &&
|
|
"Setting RetainRemappedFileBuffers to true will cause a memory leak "
|
|
"of ContentsBuffer");
|
|
|
|
// NOTE: we use Buffer.get() when adding remapped files, so we have to make
|
|
// sure it will be released if no error is emitted.
|
|
if (Preamble) {
|
|
Preamble->OverridePreamble(*CI, VFS, Buffer.get());
|
|
} else {
|
|
CI->getPreprocessorOpts().addRemappedFile(
|
|
CI->getFrontendOpts().Inputs[0].getFile(), Buffer.get());
|
|
}
|
|
|
|
auto Clang = llvm::make_unique<CompilerInstance>(PCHs);
|
|
Clang->setInvocation(std::move(CI));
|
|
Clang->createDiagnostics(&DiagsClient, false);
|
|
|
|
if (auto VFSWithRemapping = createVFSFromCompilerInvocation(
|
|
Clang->getInvocation(), Clang->getDiagnostics(), VFS))
|
|
VFS = VFSWithRemapping;
|
|
Clang->setVirtualFileSystem(VFS);
|
|
|
|
Clang->setTarget(TargetInfo::CreateTargetInfo(
|
|
Clang->getDiagnostics(), Clang->getInvocation().TargetOpts));
|
|
if (!Clang->hasTarget())
|
|
return nullptr;
|
|
|
|
// RemappedFileBuffers will handle the lifetime of the Buffer pointer,
|
|
// release it.
|
|
Buffer.release();
|
|
return Clang;
|
|
}
|
|
|
|
} // namespace clangd
|
|
} // namespace clang
|