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