ChainedIncludesSource.cpp revision e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3
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
15b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Serialization/ChainedIncludesSource.h"
16b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Serialization/ASTReader.h"
17b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Serialization/ASTWriter.h"
18b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Frontend/TextDiagnosticPrinter.h"
19b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Frontend/CompilerInstance.h"
20b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Frontend/ASTUnit.h"
21b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Parse/ParseAST.h"
22b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Lex/Preprocessor.h"
23b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Basic/TargetInfo.h"
24b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "llvm/Support/MemoryBuffer.h"
25b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
26b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisusing namespace clang;
27b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
28b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisstatic ASTReader *createASTReader(CompilerInstance &CI,
29b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                  llvm::StringRef pchFile,
30b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                  llvm::MemoryBuffer **memBufs,
31b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                  unsigned numBufs,
32b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                             ASTDeserializationListener *deserialListener = 0) {
33b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  Preprocessor &PP = CI.getPreprocessor();
34b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  llvm::OwningPtr<ASTReader> Reader;
35b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  Reader.reset(new ASTReader(PP, &CI.getASTContext(), /*isysroot=*/0,
36b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                             /*DisableValidation=*/true));
37b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  Reader->setASTMemoryBuffers(memBufs, numBufs);
38b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  Reader->setDeserializationListener(deserialListener);
39b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  switch (Reader->ReadAST(pchFile, ASTReader::PCH)) {
40b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  case ASTReader::Success:
41b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    // Set the predefines buffer as suggested by the PCH reader.
42b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    PP.setPredefines(Reader->getSuggestedPredefines());
43b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    return Reader.take();
44b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
45b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  case ASTReader::Failure:
46b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  case ASTReader::IgnorePCH:
47b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    break;
48b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  }
49b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return 0;
50b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
51b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
52b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource::~ChainedIncludesSource() {
53b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  for (unsigned i = 0, e = CIs.size(); i != e; ++i)
54b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    delete CIs[i];
55b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
56b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
57b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource *ChainedIncludesSource::create(CompilerInstance &CI) {
58b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
59b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  std::vector<std::string> &includes = CI.getPreprocessorOpts().ChainedIncludes;
60b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  assert(!includes.empty() && "No '-chain-include' in options!");
61b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
62b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  llvm::OwningPtr<ChainedIncludesSource> source(new ChainedIncludesSource());
63b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  InputKind IK = CI.getFrontendOpts().Inputs[0].first;
64b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
65b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  llvm::SmallVector<llvm::MemoryBuffer *, 4> serialBufs;
66b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
67b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  for (unsigned i = 0, e = includes.size(); i != e; ++i) {
68b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    bool firstInclude = (i == 0);
69b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    llvm::OwningPtr<CompilerInvocation> CInvok;
70b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    CInvok.reset(new CompilerInvocation(CI.getInvocation()));
71b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
72b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    CInvok->getPreprocessorOpts().ChainedIncludes.clear();
73b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    CInvok->getPreprocessorOpts().ImplicitPCHInclude.clear();
74b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    CInvok->getPreprocessorOpts().ImplicitPTHInclude.clear();
75b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    CInvok->getPreprocessorOpts().DisablePCHValidation = true;
76b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    CInvok->getPreprocessorOpts().Includes.clear();
77b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    CInvok->getPreprocessorOpts().MacroIncludes.clear();
78b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    CInvok->getPreprocessorOpts().Macros.clear();
79b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
80b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    CInvok->getFrontendOpts().Inputs.clear();
81b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    CInvok->getFrontendOpts().Inputs.push_back(std::make_pair(IK, includes[i]));
82b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
83b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    TextDiagnosticPrinter *DiagClient =
84b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      new TextDiagnosticPrinter(llvm::errs(), DiagnosticOptions());
85b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
86b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    llvm::IntrusiveRefCntPtr<Diagnostic> Diags(new Diagnostic(DiagID,
87b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                                              DiagClient));
88b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
89b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    llvm::OwningPtr<CompilerInstance> Clang(new CompilerInstance());
90b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    Clang->setInvocation(CInvok.take());
91b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    Clang->setDiagnostics(Diags.getPtr());
92b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    Clang->setTarget(TargetInfo::CreateTargetInfo(Clang->getDiagnostics(),
93b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                                  Clang->getTargetOpts()));
94b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    Clang->createFileManager();
95b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    Clang->createSourceManager(Clang->getFileManager());
96b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    Clang->createPreprocessor();
970ab547c284285e8abc31b30ded2226eb78c2af3bSebastian Redl    Clang->getDiagnosticClient().BeginSourceFile(Clang->getLangOpts(),
980ab547c284285e8abc31b30ded2226eb78c2af3bSebastian Redl                                                 &Clang->getPreprocessor());
99b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    Clang->createASTContext();
100b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
101b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    llvm::SmallVector<char, 256> serialAST;
102b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    llvm::raw_svector_ostream OS(serialAST);
103b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    llvm::OwningPtr<ASTConsumer> consumer;
104b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    consumer.reset(new PCHGenerator(Clang->getPreprocessor(), "-",
105b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                    /*Chaining=*/!firstInclude,
106b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                    /*isysroot=*/0, &OS));
107b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    Clang->getASTContext().setASTMutationListener(
108b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                            consumer->GetASTMutationListener());
109b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    Clang->setASTConsumer(consumer.take());
110b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    Clang->createSema(/*CompleteTranslationUnit=*/false, 0);
111b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
112b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    if (firstInclude) {
113b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      Preprocessor &PP = Clang->getPreprocessor();
114b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      PP.getBuiltinInfo().InitializeBuiltins(PP.getIdentifierTable(),
115b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                             PP.getLangOptions());
116b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    } else {
117b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      assert(!serialBufs.empty());
118b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      llvm::SmallVector<llvm::MemoryBuffer *, 4> bufs;
119910ee57073f87b3f598971d4e96aff9dbf56a6c8Argyrios Kyrtzidis      for (unsigned si = 0, se = serialBufs.size(); si != se; ++si) {
120b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis        bufs.push_back(llvm::MemoryBuffer::getMemBufferCopy(
121910ee57073f87b3f598971d4e96aff9dbf56a6c8Argyrios Kyrtzidis                             llvm::StringRef(serialBufs[si]->getBufferStart(),
122910ee57073f87b3f598971d4e96aff9dbf56a6c8Argyrios Kyrtzidis                                             serialBufs[si]->getBufferSize())));
123b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      }
124b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      std::string pchName = includes[i-1];
125b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      llvm::raw_string_ostream os(pchName);
126b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      os << ".pch" << i-1;
127b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      os.flush();
128b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      llvm::OwningPtr<ExternalASTSource> Reader;
129b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      Reader.reset(createASTReader(*Clang, pchName, bufs.data(), bufs.size(),
130b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                      Clang->getASTConsumer().GetASTDeserializationListener()));
131b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      if (!Reader)
132b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis        return 0;
133b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      Clang->getASTContext().setExternalSource(Reader);
134b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    }
135b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
136b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    if (!Clang->InitializeSourceManager(includes[i]))
137b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      return 0;
138b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
139b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    ParseAST(Clang->getSema());
140b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    OS.flush();
1410ab547c284285e8abc31b30ded2226eb78c2af3bSebastian Redl    Clang->getDiagnosticClient().EndSourceFile();
142b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    serialBufs.push_back(
143b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis      llvm::MemoryBuffer::getMemBufferCopy(llvm::StringRef(serialAST.data(),
144b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                                           serialAST.size())));
145b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    source->CIs.push_back(Clang.take());
146b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  }
147b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
148b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  assert(!serialBufs.empty());
149b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  std::string pchName = includes.back() + ".pch-final";
150b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  llvm::OwningPtr<ASTReader> Reader;
151b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  Reader.reset(createASTReader(CI, pchName,
152b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                               serialBufs.data(), serialBufs.size()));
153b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  if (!Reader)
154b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis    return 0;
155b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
156b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  source->FinalReader.reset(Reader.take());
157b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return source.take();
158b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
159b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
160b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
161b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// ExternalASTSource interface.
162b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
163b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis
164b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisDecl *ChainedIncludesSource::GetExternalDecl(uint32_t ID) {
165b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().GetExternalDecl(ID);
166b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
167b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisSelector ChainedIncludesSource::GetExternalSelector(uint32_t ID) {
168b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().GetExternalSelector(ID);
169b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
170b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisuint32_t ChainedIncludesSource::GetNumExternalSelectors() {
171b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().GetNumExternalSelectors();
172b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
173b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisStmt *ChainedIncludesSource::GetExternalDeclStmt(uint64_t Offset) {
174b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().GetExternalDeclStmt(Offset);
175b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
176b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisCXXBaseSpecifier *
177b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
178b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().GetExternalCXXBaseSpecifiers(Offset);
179b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
180b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisDeclContextLookupResult
181b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource::FindExternalVisibleDeclsByName(const DeclContext *DC,
182b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                                      DeclarationName Name) {
183b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().FindExternalVisibleDeclsByName(DC, Name);
184b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
185b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::MaterializeVisibleDecls(const DeclContext *DC) {
186b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().MaterializeVisibleDecls(DC);
187b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
188b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisbool ChainedIncludesSource::FindExternalLexicalDecls(const DeclContext *DC,
189b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                      bool (*isKindWeWant)(Decl::Kind),
190b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis                                      llvm::SmallVectorImpl<Decl*> &Result) {
191b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().FindExternalLexicalDecls(DC, isKindWeWant, Result);
192b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
193b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::CompleteType(TagDecl *Tag) {
194b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().CompleteType(Tag);
195b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
196b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::CompleteType(ObjCInterfaceDecl *Class) {
197b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().CompleteType(Class);
198b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
199b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::StartedDeserializing() {
200b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().StartedDeserializing();
201b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
202b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::FinishedDeserializing() {
203b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().FinishedDeserializing();
204b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
205b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::StartTranslationUnit(ASTConsumer *Consumer) {
206b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().StartTranslationUnit(Consumer);
207b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
208b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::PrintStats() {
209b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis  return getFinalReader().PrintStats();
210b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis}
211e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenekvoid ChainedIncludesSource::getMemoryBufferSizes(MemoryBufferSizes &sizes)const{
212e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek  for (unsigned i = 0, e = CIs.size(); i != e; ++i) {
213e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek    if (const ExternalASTSource *eSrc =
214e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek        CIs[i]->getASTContext().getExternalSource()) {
215e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek      eSrc->getMemoryBufferSizes(sizes);
216e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek    }
217e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek  }
218e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek
219e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek  getFinalReader().getMemoryBufferSizes(sizes);
220e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek}
221ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl
222ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redlvoid ChainedIncludesSource::InitializeSema(Sema &S) {
223ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl  return getFinalReader().InitializeSema(S);
224ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl}
225ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redlvoid ChainedIncludesSource::ForgetSema() {
226ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl  return getFinalReader().ForgetSema();
227ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl}
228ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redlstd::pair<ObjCMethodList,ObjCMethodList>
229ce0682ff4647b885d41847b0f97918504282c2e8Sebastian RedlChainedIncludesSource::ReadMethodPool(Selector Sel) {
230ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl  return getFinalReader().ReadMethodPool(Sel);
231ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl}
232ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redlbool ChainedIncludesSource::LookupUnqualified(LookupResult &R, Scope *S) {
233ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl  return getFinalReader().LookupUnqualified(R, S);
234ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl}
235ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl
236