1b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis//===- ChainedIncludesSource.cpp - Chained PCHs in Memory -------*- C++ -*-===// 2b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// 3b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// The LLVM Compiler Infrastructure 4b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// 5b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 6b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// License. See LICENSE.TXT for details. 7b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// 8b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 9b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// 10b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// This file defines the ChainedIncludesSource class, which converts headers 11b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// to chained PCHs in memory, mainly used for testing. 12b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// 13b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 14b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/TargetInfo.h" 16b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Frontend/ASTUnit.h" 1755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/CompilerInstance.h" 1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/TextDiagnosticPrinter.h" 1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Preprocessor.h" 2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Parse/ParseAST.h" 2171088d1af241ad114294ec3fe03cd9baea39ee08Chandler Carruth#include "clang/Serialization/ASTReader.h" 2271088d1af241ad114294ec3fe03cd9baea39ee08Chandler Carruth#include "clang/Serialization/ASTWriter.h" 23b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "llvm/Support/MemoryBuffer.h" 24b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 25b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisusing namespace clang; 26b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 27c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesnamespace { 28c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass ChainedIncludesSource : public ExternalSemaSource { 29c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic: 3058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar ~ChainedIncludesSource() override; 31c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 32c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExternalSemaSource &getFinalReader() const { return *FinalReader; } 33c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 34c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::vector<CompilerInstance *> CIs; 35c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines IntrusiveRefCntPtr<ExternalSemaSource> FinalReader; 36c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 37c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesprotected: 38c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines //===----------------------------------------------------------------------===// 39c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // ExternalASTSource interface. 40c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines //===----------------------------------------------------------------------===// 41c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 42c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Decl *GetExternalDecl(uint32_t ID) override; 43c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Selector GetExternalSelector(uint32_t ID) override; 44c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines uint32_t GetNumExternalSelectors() override; 45c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Stmt *GetExternalDeclStmt(uint64_t Offset) override; 463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar CXXCtorInitializer **GetExternalCXXCtorInitializers(uint64_t Offset) override; 47c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CXXBaseSpecifier *GetExternalCXXBaseSpecifiers(uint64_t Offset) override; 48c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool FindExternalVisibleDeclsByName(const DeclContext *DC, 49c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines DeclarationName Name) override; 50a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar void 51c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FindExternalLexicalDecls(const DeclContext *DC, 52a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 53c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SmallVectorImpl<Decl *> &Result) override; 54c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void CompleteType(TagDecl *Tag) override; 55c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void CompleteType(ObjCInterfaceDecl *Class) override; 56c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void StartedDeserializing() override; 57c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void FinishedDeserializing() override; 58c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void StartTranslationUnit(ASTConsumer *Consumer) override; 59c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void PrintStats() override; 60c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 61c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// Return the amount of memory used by memory buffers, breaking down 62c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// by heap-backed versus mmap'ed memory. 63c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override; 64c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 65c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines //===----------------------------------------------------------------------===// 66c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // ExternalSemaSource interface. 67c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines //===----------------------------------------------------------------------===// 68c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 69c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void InitializeSema(Sema &S) override; 70c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void ForgetSema() override; 71c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void ReadMethodPool(Selector Sel) override; 72c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool LookupUnqualified(LookupResult &R, Scope *S) override; 73c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}; 74c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 75c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic ASTReader * 776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinescreateASTReader(CompilerInstance &CI, StringRef pchFile, 78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallVectorImpl<std::unique_ptr<llvm::MemoryBuffer>> &MemBufs, 796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SmallVectorImpl<std::string> &bufNames, 806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ASTDeserializationListener *deserialListener = nullptr) { 81b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Preprocessor &PP = CI.getPreprocessor(); 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<ASTReader> Reader; 83a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar Reader.reset(new ASTReader(PP, CI.getASTContext(), 84a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CI.getPCHContainerReader(), 85a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar /*Extensions=*/{ }, 86a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar /*isysroot=*/"", /*DisableValidation=*/true)); 87c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner for (unsigned ti = 0; ti < bufNames.size(); ++ti) { 88c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner StringRef sr(bufNames[ti]); 89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Reader->addInMemoryBuffer(sr, std::move(MemBufs[ti])); 90c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner } 91b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Reader->setDeserializationListener(deserialListener); 92958bcaf3d4e0c1ae46de3e84e7c2a7638c3c5286Argyrios Kyrtzidis switch (Reader->ReadAST(pchFile, serialization::MK_PCH, SourceLocation(), 9338295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor ASTReader::ARR_None)) { 94b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis case ASTReader::Success: 95b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis // Set the predefines buffer as suggested by the PCH reader. 96b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis PP.setPredefines(Reader->getSuggestedPredefines()); 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Reader.release(); 98b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 99b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis case ASTReader::Failure: 100677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ASTReader::Missing: 1014825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::OutOfDate: 1024825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::VersionMismatch: 1034825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::ConfigurationMismatch: 1044825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::HadErrors: 105b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis break; 106b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis } 1076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 108b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 109b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 110b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource::~ChainedIncludesSource() { 111b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis for (unsigned i = 0, e = CIs.size(); i != e; ++i) 112b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis delete CIs[i]; 113b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 114b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 115c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesIntrusiveRefCntPtr<ExternalSemaSource> clang::createChainedIncludesSource( 116c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CompilerInstance &CI, IntrusiveRefCntPtr<ExternalSemaSource> &Reader) { 117b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 118b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis std::vector<std::string> &includes = CI.getPreprocessorOpts().ChainedIncludes; 119b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis assert(!includes.empty() && "No '-chain-include' in options!"); 120b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IntrusiveRefCntPtr<ChainedIncludesSource> source(new ChainedIncludesSource()); 1228616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis InputKind IK = CI.getFrontendOpts().Inputs[0].getKind(); 123b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallVector<std::unique_ptr<llvm::MemoryBuffer>, 4> SerialBufs; 125c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner SmallVector<std::string, 4> serialBufNames; 126b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 127b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis for (unsigned i = 0, e = includes.size(); i != e; ++i) { 128b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis bool firstInclude = (i == 0); 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<CompilerInvocation> CInvok; 130b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok.reset(new CompilerInvocation(CI.getInvocation())); 131b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 132b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().ChainedIncludes.clear(); 133b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().ImplicitPCHInclude.clear(); 134b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().ImplicitPTHInclude.clear(); 135b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().DisablePCHValidation = true; 136b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().Includes.clear(); 137b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().MacroIncludes.clear(); 138b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().Macros.clear(); 139b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 140b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getFrontendOpts().Inputs.clear(); 1418e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis FrontendInputFile InputFile(includes[i], IK); 1428e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis CInvok->getFrontendOpts().Inputs.push_back(InputFile); 143b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 144b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis TextDiagnosticPrinter *DiagClient = 14502c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor new TextDiagnosticPrinter(llvm::errs(), new DiagnosticOptions()); 146c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); 147c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 14802c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor new DiagnosticsEngine(DiagID, &CI.getDiagnosticOpts(), DiagClient)); 149b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 150a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar std::unique_ptr<CompilerInstance> Clang( 151a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar new CompilerInstance(CI.getPCHContainerOperations())); 152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Clang->setInvocation(CInvok.release()); 153c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Clang->setDiagnostics(Diags.get()); 154c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Clang->setTarget(TargetInfo::CreateTargetInfo( 155c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Clang->getDiagnostics(), Clang->getInvocation().TargetOpts)); 156b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->createFileManager(); 157b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->createSourceManager(Clang->getFileManager()); 158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Clang->createPreprocessor(TU_Prefix); 1590ab547c284285e8abc31b30ded2226eb78c2af3bSebastian Redl Clang->getDiagnosticClient().BeginSourceFile(Clang->getLangOpts(), 1600ab547c284285e8abc31b30ded2226eb78c2af3bSebastian Redl &Clang->getPreprocessor()); 161b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->createASTContext(); 162b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 163a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar auto Buffer = std::make_shared<PCHBuffer>(); 164a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar ArrayRef<llvm::IntrusiveRefCntPtr<ModuleFileExtension>> Extensions; 165a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar auto consumer = llvm::make_unique<PCHGenerator>( 166a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar Clang->getPreprocessor(), "-", nullptr, /*isysroot=*/"", Buffer, 167a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar Extensions); 168b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->getASTContext().setASTMutationListener( 169b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis consumer->GetASTMutationListener()); 170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Clang->setASTConsumer(std::move(consumer)); 1716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Clang->createSema(TU_Prefix, nullptr); 172b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 173b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis if (firstInclude) { 174b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Preprocessor &PP = Clang->getPreprocessor(); 175a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar PP.getBuiltinInfo().initializeBuiltins(PP.getIdentifierTable(), 1764e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie PP.getLangOpts()); 177b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis } else { 178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(!SerialBufs.empty()); 179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallVector<std::unique_ptr<llvm::MemoryBuffer>, 4> Bufs; 180c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // TODO: Pass through the existing MemoryBuffer instances instead of 181c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // allocating new ones. 182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (auto &SB : SerialBufs) 183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Bufs.push_back(llvm::MemoryBuffer::getMemBuffer(SB->getBuffer())); 184b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis std::string pchName = includes[i-1]; 185b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis llvm::raw_string_ostream os(pchName); 186b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis os << ".pch" << i-1; 187c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines serialBufNames.push_back(os.str()); 188c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner 189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IntrusiveRefCntPtr<ASTReader> Reader; 190176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Reader = createASTReader( 191176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines *Clang, pchName, Bufs, serialBufNames, 192176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Clang->getASTConsumer().GetASTDeserializationListener()); 193b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis if (!Reader) 1946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Clang->setModuleManager(Reader); 196b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->getASTContext().setExternalSource(Reader); 197b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis } 198b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 1998e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis if (!Clang->InitializeSourceManager(InputFile)) 2006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 201b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 202b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis ParseAST(Clang->getSema()); 2030ab547c284285e8abc31b30ded2226eb78c2af3bSebastian Redl Clang->getDiagnosticClient().EndSourceFile(); 204a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar assert(Buffer->IsComplete && "serialization did not complete"); 205a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar auto &serialAST = Buffer->Data; 206a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar SerialBufs.push_back(llvm::MemoryBuffer::getMemBufferCopy( 207a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar StringRef(serialAST.data(), serialAST.size()))); 208a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar serialAST.clear(); 209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines source->CIs.push_back(Clang.release()); 210b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis } 211b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(!SerialBufs.empty()); 213b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis std::string pchName = includes.back() + ".pch-final"; 214c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner serialBufNames.push_back(pchName); 215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Reader = createASTReader(CI, pchName, SerialBufs, serialBufNames); 216b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis if (!Reader) 2176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 218b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines source->FinalReader = Reader; 220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return source; 221b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 222b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 223b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 224b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// ExternalASTSource interface. 225b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 226b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 227b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisDecl *ChainedIncludesSource::GetExternalDecl(uint32_t ID) { 228b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().GetExternalDecl(ID); 229b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 230b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisSelector ChainedIncludesSource::GetExternalSelector(uint32_t ID) { 231b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().GetExternalSelector(ID); 232b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 233b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisuint32_t ChainedIncludesSource::GetNumExternalSelectors() { 234b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().GetNumExternalSelectors(); 235b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 236b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisStmt *ChainedIncludesSource::GetExternalDeclStmt(uint64_t Offset) { 237b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().GetExternalDeclStmt(Offset); 238b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 239b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisCXXBaseSpecifier * 240b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 241b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().GetExternalCXXBaseSpecifiers(Offset); 242b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 2433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarCXXCtorInitializer ** 2443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarChainedIncludesSource::GetExternalCXXCtorInitializers(uint64_t Offset) { 2453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return getFinalReader().GetExternalCXXCtorInitializers(Offset); 2463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 2473646c68676c3c46a026b23d52188ef6e0d856178Richard Smithbool 248b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource::FindExternalVisibleDeclsByName(const DeclContext *DC, 249b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis DeclarationName Name) { 250b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().FindExternalVisibleDeclsByName(DC, Name); 251b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 252a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid ChainedIncludesSource::FindExternalLexicalDecls( 253a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 254a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar SmallVectorImpl<Decl *> &Result) { 255a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar return getFinalReader().FindExternalLexicalDecls(DC, IsKindWeWant, Result); 256b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 257b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::CompleteType(TagDecl *Tag) { 258b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().CompleteType(Tag); 259b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 260b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::CompleteType(ObjCInterfaceDecl *Class) { 261b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().CompleteType(Class); 262b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 263b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::StartedDeserializing() { 264b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().StartedDeserializing(); 265b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 266b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::FinishedDeserializing() { 267b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().FinishedDeserializing(); 268b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 269b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::StartTranslationUnit(ASTConsumer *Consumer) { 270b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().StartTranslationUnit(Consumer); 271b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 272b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::PrintStats() { 273b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().PrintStats(); 274b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 275e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenekvoid ChainedIncludesSource::getMemoryBufferSizes(MemoryBufferSizes &sizes)const{ 276e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek for (unsigned i = 0, e = CIs.size(); i != e; ++i) { 277e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek if (const ExternalASTSource *eSrc = 278e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek CIs[i]->getASTContext().getExternalSource()) { 279e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek eSrc->getMemoryBufferSizes(sizes); 280e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek } 281e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek } 282e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek 283e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek getFinalReader().getMemoryBufferSizes(sizes); 284e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek} 285ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl 286ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redlvoid ChainedIncludesSource::InitializeSema(Sema &S) { 287ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl return getFinalReader().InitializeSema(S); 288ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl} 289ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redlvoid ChainedIncludesSource::ForgetSema() { 290ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl return getFinalReader().ForgetSema(); 291ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl} 2925ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregorvoid ChainedIncludesSource::ReadMethodPool(Selector Sel) { 2935ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor getFinalReader().ReadMethodPool(Sel); 294ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl} 295ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redlbool ChainedIncludesSource::LookupUnqualified(LookupResult &R, Scope *S) { 296ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl return getFinalReader().LookupUnqualified(R, S); 297ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl} 298ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl 299