summaryrefslogtreecommitdiffstats
path: root/clangd/ClangdUnit.cpp
diff options
context:
space:
mode:
authorIlya Biryukov <ibiryukov@google.com>2017-11-24 13:04:21 +0000
committerIlya Biryukov <ibiryukov@google.com>2017-11-24 13:04:21 +0000
commitb6090a29994997f6e7bc782c567ae7b3aa9feeab (patch)
tree00a30a15a13e3fc46e7b60269d12f9c34c2b7147 /clangd/ClangdUnit.cpp
parent821d5b6353f0408d1e951c613e83b73ac9675cca (diff)
[clangd] Ensure preamble outlives the AST
Summary: In-memory preambles will not be copied anymore, so we need to make sure they outlive the AST. Reviewers: bkramer, sammccall, klimek Reviewed By: sammccall Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D40301 git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@318944 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'clangd/ClangdUnit.cpp')
-rw-r--r--clangd/ClangdUnit.cpp62
1 files changed, 27 insertions, 35 deletions
diff --git a/clangd/ClangdUnit.cpp b/clangd/ClangdUnit.cpp
index 6e01c675..c5f68807 100644
--- a/clangd/ClangdUnit.cpp
+++ b/clangd/ClangdUnit.cpp
@@ -879,8 +879,7 @@ void clangd::dumpAST(ParsedAST &AST, llvm::raw_ostream &OS) {
llvm::Optional<ParsedAST>
ParsedAST::Build(std::unique_ptr<clang::CompilerInvocation> CI,
- const PrecompiledPreamble *Preamble,
- ArrayRef<serialization::DeclID> PreambleDeclIDs,
+ std::shared_ptr<const PreambleData> Preamble,
std::unique_ptr<llvm::MemoryBuffer> Buffer,
std::shared_ptr<PCHContainerOperations> PCHs,
IntrusiveRefCntPtr<vfs::FileSystem> VFS,
@@ -889,8 +888,10 @@ ParsedAST::Build(std::unique_ptr<clang::CompilerInvocation> CI,
std::vector<DiagWithFixIts> ASTDiags;
StoreDiagsConsumer UnitDiagsConsumer(/*ref*/ ASTDiags);
+ const PrecompiledPreamble *PreamblePCH =
+ Preamble ? &Preamble->Preamble : nullptr;
auto Clang = prepareCompilerInstance(
- std::move(CI), Preamble, std::move(Buffer), std::move(PCHs),
+ std::move(CI), PreamblePCH, std::move(Buffer), std::move(PCHs),
std::move(VFS), /*ref*/ UnitDiagsConsumer);
// Recover resources if we crash before exiting this method.
@@ -912,15 +913,8 @@ ParsedAST::Build(std::unique_ptr<clang::CompilerInvocation> CI,
Clang->getDiagnostics().setClient(new EmptyDiagsConsumer);
std::vector<const Decl *> ParsedDecls = Action->takeTopLevelDecls();
- std::vector<serialization::DeclID> PendingDecls;
- if (Preamble) {
- PendingDecls.reserve(PreambleDeclIDs.size());
- PendingDecls.insert(PendingDecls.begin(), PreambleDeclIDs.begin(),
- PreambleDeclIDs.end());
- }
-
- return ParsedAST(std::move(Clang), std::move(Action), std::move(ParsedDecls),
- std::move(PendingDecls), std::move(ASTDiags));
+ return ParsedAST(std::move(Preamble), std::move(Clang), std::move(Action),
+ std::move(ParsedDecls), std::move(ASTDiags));
}
namespace {
@@ -1061,24 +1055,25 @@ std::vector<Location> clangd::findDefinitions(ParsedAST &AST, Position Pos,
}
void ParsedAST::ensurePreambleDeclsDeserialized() {
- if (PendingTopLevelDecls.empty())
+ if (PreambleDeclsDeserialized || !Preamble)
return;
std::vector<const Decl *> Resolved;
- Resolved.reserve(PendingTopLevelDecls.size());
+ Resolved.reserve(Preamble->TopLevelDeclIDs.size());
ExternalASTSource &Source = *getASTContext().getExternalSource();
- for (serialization::DeclID TopLevelDecl : PendingTopLevelDecls) {
+ for (serialization::DeclID TopLevelDecl : Preamble->TopLevelDeclIDs) {
// Resolve the declaration ID to an actual declaration, possibly
// deserializing the declaration in the process.
if (Decl *D = Source.GetExternalDecl(TopLevelDecl))
Resolved.push_back(D);
}
- TopLevelDecls.reserve(TopLevelDecls.size() + PendingTopLevelDecls.size());
+ TopLevelDecls.reserve(TopLevelDecls.size() +
+ Preamble->TopLevelDeclIDs.size());
TopLevelDecls.insert(TopLevelDecls.begin(), Resolved.begin(), Resolved.end());
- PendingTopLevelDecls.clear();
+ PreambleDeclsDeserialized = true;
}
ParsedAST::ParsedAST(ParsedAST &&Other) = default;
@@ -1112,14 +1107,21 @@ const std::vector<DiagWithFixIts> &ParsedAST::getDiagnostics() const {
return Diags;
}
-ParsedAST::ParsedAST(std::unique_ptr<CompilerInstance> Clang,
+PreambleData::PreambleData(PrecompiledPreamble Preamble,
+ std::vector<serialization::DeclID> TopLevelDeclIDs,
+ std::vector<DiagWithFixIts> Diags)
+ : Preamble(std::move(Preamble)),
+ TopLevelDeclIDs(std::move(TopLevelDeclIDs)), Diags(std::move(Diags)) {}
+
+ParsedAST::ParsedAST(std::shared_ptr<const PreambleData> Preamble,
+ std::unique_ptr<CompilerInstance> Clang,
std::unique_ptr<FrontendAction> Action,
std::vector<const Decl *> TopLevelDecls,
- std::vector<serialization::DeclID> PendingTopLevelDecls,
std::vector<DiagWithFixIts> Diags)
- : Clang(std::move(Clang)), Action(std::move(Action)),
- Diags(std::move(Diags)), TopLevelDecls(std::move(TopLevelDecls)),
- PendingTopLevelDecls(std::move(PendingTopLevelDecls)) {
+ : Preamble(std::move(Preamble)), Clang(std::move(Clang)),
+ Action(std::move(Action)), Diags(std::move(Diags)),
+ TopLevelDecls(std::move(TopLevelDecls)),
+ PreambleDeclsDeserialized(false) {
assert(this->Clang);
assert(this->Action);
}
@@ -1130,12 +1132,6 @@ ParsedASTWrapper::ParsedASTWrapper(ParsedASTWrapper &&Wrapper)
ParsedASTWrapper::ParsedASTWrapper(llvm::Optional<ParsedAST> AST)
: AST(std::move(AST)) {}
-PreambleData::PreambleData(PrecompiledPreamble Preamble,
- std::vector<serialization::DeclID> TopLevelDeclIDs,
- std::vector<DiagWithFixIts> Diags)
- : Preamble(std::move(Preamble)),
- TopLevelDeclIDs(std::move(TopLevelDeclIDs)), Diags(std::move(Diags)) {}
-
std::shared_ptr<CppFile>
CppFile::Create(PathRef FileName, tooling::CompileCommand Command,
bool StorePreamblesInMemory,
@@ -1330,12 +1326,8 @@ CppFile::deferRebuild(StringRef NewContents,
} // unlock Mutex
// Prepare the Preamble and supplementary data for rebuilding AST.
- const PrecompiledPreamble *PreambleForAST = nullptr;
- ArrayRef<serialization::DeclID> SerializedPreambleDecls = llvm::None;
std::vector<DiagWithFixIts> Diagnostics;
if (NewPreamble) {
- PreambleForAST = &NewPreamble->Preamble;
- SerializedPreambleDecls = NewPreamble->TopLevelDeclIDs;
Diagnostics.insert(Diagnostics.begin(), NewPreamble->Diags.begin(),
NewPreamble->Diags.end());
}
@@ -1345,9 +1337,9 @@ CppFile::deferRebuild(StringRef NewContents,
{
trace::Span Tracer("Build");
SPAN_ATTACH(Tracer, "File", That->FileName);
- NewAST = ParsedAST::Build(
- std::move(CI), PreambleForAST, SerializedPreambleDecls,
- std::move(ContentsBuffer), PCHs, VFS, That->Logger);
+ NewAST =
+ ParsedAST::Build(std::move(CI), std::move(NewPreamble),
+ std::move(ContentsBuffer), PCHs, VFS, That->Logger);
}
if (NewAST) {