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