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(os.str());
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());
Defines enum values for all the target-independent builtin functions.
static ASTReader * createASTReader(CompilerInstance &CI, StringRef pchFile, SmallVectorImpl< std::unique_ptr< llvm::MemoryBuffer > > &MemBufs, SmallVectorImpl< std::string > &bufNames, ASTDeserializationListener *deserialListener=nullptr)
Defines the clang::Preprocessor interface.
Reads an AST files chain containing the contents of a translation unit.
@ ARR_None
The client can't handle any AST loading failures.
@ Success
The control block was read successfully.
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
@ Failure
The AST file itself appears corrupted.
@ VersionMismatch
The AST file was written by a different version of Clang.
@ HadErrors
The AST file has errors.
@ Missing
The AST file was missing.
void initializeBuiltins(IdentifierTable &Table, const LangOptions &LangOpts)
Mark the identifiers for all the builtins with their appropriate builtin ID # and mark any non-portab...
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
const PCHContainerReader & getPCHContainerReader() const
Return the appropriate PCHContainerReader depending on the current CodeGenOptions.
InMemoryModuleCache & getModuleCache() const
Preprocessor & getPreprocessor() const
Return the current preprocessor.
ASTContext & getASTContext() const
FrontendOptions & getFrontendOpts()
CompilerInvocation & getInvocation()
PreprocessorOptions & getPreprocessorOpts()
std::shared_ptr< PCHContainerOperations > getPCHContainerOperations() const
DiagnosticOptions & getDiagnosticOpts()
Helper class for holding the data necessary to invoke the compiler.
Used for handling and querying diagnostic IDs.
Options for controlling the compiler diagnostics engine.
Concrete class used by the front-end to report problems and issues.
Abstract interface for external sources of AST nodes.
MemoryBufferSizes getMemoryBufferSizes() const
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
An abstract interface that should be implemented by external AST sources that also provide informatio...
SmallVector< FrontendInputFile, 0 > Inputs
The input files and their types.
std::vector< std::string > ChainedIncludes
Headers that will be converted to chained PCHs in memory.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
void setPredefines(std::string P)
Set the predefines for this Preprocessor.
IdentifierTable & getIdentifierTable()
Builtin::Context & getBuiltinInfo()
const LangOptions & getLangOpts() const
Encodes a location in the source.
static TargetInfo * CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr< TargetOptions > &Opts)
Construct a target for the given options.
Defines the clang::TargetInfo interface.
@ MK_PCH
File is a PCH file treated as such.
The JSON file list parser is used to communicate input to InstallAPI.
void ParseAST(Preprocessor &pp, ASTConsumer *C, ASTContext &Ctx, bool PrintStats=false, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr, bool SkipFunctionBodies=false)
Parse the entire file specified, notifying the ASTConsumer as the file is parsed.
IntrusiveRefCntPtr< ExternalSemaSource > createChainedIncludesSource(CompilerInstance &CI, IntrusiveRefCntPtr< ExternalSemaSource > &Reader)
The ChainedIncludesSource class converts headers to chained PCHs in memory, mainly for testing.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.