25#include "llvm/Support/MemoryBuffer.h"
32 ChainedIncludesSource(std::vector<std::unique_ptr<CompilerInstance>> CIs)
33 : CIs(
std::move(CIs)) {}
43 for (
unsigned i = 0, e = CIs.size(); i != e; ++i) {
45 CIs[i]->getASTContext().getExternalSource()) {
46 eSrc->getMemoryBufferSizes(sizes);
52 std::vector<std::unique_ptr<CompilerInstance>> CIs;
62 std::unique_ptr<ASTReader> Reader;
66 "", DisableValidationForModuleKind::PCH));
67 for (
unsigned ti = 0; ti < bufNames.size(); ++ti) {
68 StringRef sr(bufNames[ti]);
69 Reader->addInMemoryBuffer(sr, std::move(MemBufs[ti]));
71 Reader->setDeserializationListener(deserialListener);
77 return Reader.release();
94 assert(!includes.empty() &&
"No '-chain-include' in options!");
96 std::vector<std::unique_ptr<CompilerInstance>> CIs;
102 for (
unsigned i = 0, e = includes.size(); i != e; ++i) {
103 bool firstInclude = (i == 0);
104 std::unique_ptr<CompilerInvocation> CInvok;
107 CInvok->getPreprocessorOpts().ChainedIncludes.clear();
108 CInvok->getPreprocessorOpts().ImplicitPCHInclude.clear();
109 CInvok->getPreprocessorOpts().DisablePCHOrModuleValidation =
110 DisableValidationForModuleKind::PCH;
111 CInvok->getPreprocessorOpts().Includes.clear();
112 CInvok->getPreprocessorOpts().MacroIncludes.clear();
113 CInvok->getPreprocessorOpts().Macros.clear();
115 CInvok->getFrontendOpts().Inputs.clear();
117 CInvok->getFrontendOpts().Inputs.push_back(InputFile);
125 std::unique_ptr<CompilerInstance> Clang(
127 Clang->setInvocation(std::move(CInvok));
128 Clang->setDiagnostics(Diags.get());
130 Clang->getDiagnostics(), Clang->getInvocation().TargetOpts));
131 Clang->createFileManager();
132 Clang->createSourceManager(Clang->getFileManager());
134 Clang->getDiagnosticClient().BeginSourceFile(Clang->getLangOpts(),
135 &Clang->getPreprocessor());
136 Clang->createASTContext();
138 auto Buffer = std::make_shared<PCHBuffer>();
140 auto consumer = std::make_unique<PCHGenerator>(
141 Clang->getPreprocessor(), Clang->getModuleCache(),
"-",
"",
142 Buffer, Extensions,
true);
143 Clang->getASTContext().setASTMutationListener(
144 consumer->GetASTMutationListener());
145 Clang->setASTConsumer(std::move(consumer));
153 assert(!SerialBufs.empty());
157 for (
auto &SB : SerialBufs)
158 Bufs.push_back(llvm::MemoryBuffer::getMemBuffer(SB->getBuffer()));
159 std::string pchName = includes[i-1];
160 llvm::raw_string_ostream os(pchName);
162 serialBufNames.push_back(pchName);
166 *Clang, pchName, Bufs, serialBufNames,
167 Clang->getASTConsumer().GetASTDeserializationListener());
170 Clang->setASTReader(Reader);
171 Clang->getASTContext().setExternalSource(Reader);
174 if (!Clang->InitializeSourceManager(InputFile))
178 Clang->getDiagnosticClient().EndSourceFile();
179 assert(Buffer->IsComplete &&
"serialization did not complete");
180 auto &serialAST = Buffer->Data;
181 SerialBufs.push_back(llvm::MemoryBuffer::getMemBufferCopy(
182 StringRef(serialAST.data(), serialAST.size())));
184 CIs.push_back(std::move(Clang));
187 assert(!SerialBufs.empty());
188 std::string pchName = includes.back() +
".pch-final";
189 serialBufNames.push_back(pchName);
195 llvm::makeIntrusiveRefCnt<ChainedIncludesSource>(std::move(CIs));
196 return llvm::makeIntrusiveRefCnt<MultiplexExternalSemaSource>(
197 ChainedSrc.get(), Reader.get());