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 1571088d1af241ad114294ec3fe03cd9baea39ee08Chandler Carruth#include "clang/Frontend/ChainedIncludesSource.h" 16b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Frontend/TextDiagnosticPrinter.h" 17b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Frontend/CompilerInstance.h" 18b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis#include "clang/Frontend/ASTUnit.h" 1971088d1af241ad114294ec3fe03cd9baea39ee08Chandler Carruth#include "clang/Serialization/ASTReader.h" 2071088d1af241ad114294ec3fe03cd9baea39ee08Chandler Carruth#include "clang/Serialization/ASTWriter.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, 29c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner StringRef pchFile, 30c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner SmallVector<llvm::MemoryBuffer *, 4> &memBufs, 31c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner SmallVector<std::string, 4> &bufNames, 32b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis ASTDeserializationListener *deserialListener = 0) { 33b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Preprocessor &PP = CI.getPreprocessor(); 346f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ASTReader> Reader; 35f8a1e51c48761ee1d7803c3fa35ac94f42ebb55eDouglas Gregor Reader.reset(new ASTReader(PP, CI.getASTContext(), /*isysroot=*/"", 36b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis /*DisableValidation=*/true)); 37c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner for (unsigned ti = 0; ti < bufNames.size(); ++ti) { 38c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner StringRef sr(bufNames[ti]); 39c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner Reader->addInMemoryBuffer(sr, memBufs[ti]); 40c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner } 41b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Reader->setDeserializationListener(deserialListener); 4272a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas Gregor switch (Reader->ReadAST(pchFile, serialization::MK_PCH)) { 43b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis case ASTReader::Success: 44b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis // Set the predefines buffer as suggested by the PCH reader. 45b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis PP.setPredefines(Reader->getSuggestedPredefines()); 46b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return Reader.take(); 47b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 48b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis case ASTReader::Failure: 49b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis case ASTReader::IgnorePCH: 50b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis break; 51b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis } 52b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return 0; 53b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 54b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 55b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource::~ChainedIncludesSource() { 56b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis for (unsigned i = 0, e = CIs.size(); i != e; ++i) 57b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis delete CIs[i]; 58b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 59b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 60b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource *ChainedIncludesSource::create(CompilerInstance &CI) { 61b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 62b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis std::vector<std::string> &includes = CI.getPreprocessorOpts().ChainedIncludes; 63b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis assert(!includes.empty() && "No '-chain-include' in options!"); 64b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 656f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ChainedIncludesSource> source(new ChainedIncludesSource()); 661f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor InputKind IK = CI.getFrontendOpts().Inputs[0].Kind; 67b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<llvm::MemoryBuffer *, 4> serialBufs; 69c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner SmallVector<std::string, 4> serialBufNames; 70b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 71b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis for (unsigned i = 0, e = includes.size(); i != e; ++i) { 72b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis bool firstInclude = (i == 0); 736f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<CompilerInvocation> CInvok; 74b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok.reset(new CompilerInvocation(CI.getInvocation())); 75b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 76b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().ChainedIncludes.clear(); 77b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().ImplicitPCHInclude.clear(); 78b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().ImplicitPTHInclude.clear(); 79b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().DisablePCHValidation = true; 80b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().Includes.clear(); 81b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().MacroIncludes.clear(); 82b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getPreprocessorOpts().Macros.clear(); 83b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 84b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis CInvok->getFrontendOpts().Inputs.clear(); 851f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor CInvok->getFrontendOpts().Inputs.push_back(FrontendInputFile(includes[i], 861f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor IK)); 87b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 88b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis TextDiagnosticPrinter *DiagClient = 89b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis new TextDiagnosticPrinter(llvm::errs(), DiagnosticOptions()); 90c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); 91c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 92d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie new DiagnosticsEngine(DiagID, DiagClient)); 93b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 946f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<CompilerInstance> Clang(new CompilerInstance()); 95b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->setInvocation(CInvok.take()); 96b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->setDiagnostics(Diags.getPtr()); 97b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->setTarget(TargetInfo::CreateTargetInfo(Clang->getDiagnostics(), 98b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->getTargetOpts())); 99b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->createFileManager(); 100b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->createSourceManager(Clang->getFileManager()); 101b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->createPreprocessor(); 1020ab547c284285e8abc31b30ded2226eb78c2af3bSebastian Redl Clang->getDiagnosticClient().BeginSourceFile(Clang->getLangOpts(), 1030ab547c284285e8abc31b30ded2226eb78c2af3bSebastian Redl &Clang->getPreprocessor()); 104b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->createASTContext(); 105b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 1065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<char, 256> serialAST; 107b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis llvm::raw_svector_ostream OS(serialAST); 1086f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ASTConsumer> consumer; 109a8cc6ce36e70e2afa22ab6b4340035cb3941c2ebDouglas Gregor consumer.reset(new PCHGenerator(Clang->getPreprocessor(), "-", 0, 110a8cc6ce36e70e2afa22ab6b4340035cb3941c2ebDouglas Gregor /*isysroot=*/"", &OS)); 111b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->getASTContext().setASTMutationListener( 112b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis consumer->GetASTMutationListener()); 113b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->setASTConsumer(consumer.take()); 114467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor Clang->createSema(TU_Prefix, 0); 115b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 116b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis if (firstInclude) { 117b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Preprocessor &PP = Clang->getPreprocessor(); 118b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis PP.getBuiltinInfo().InitializeBuiltins(PP.getIdentifierTable(), 1194e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie PP.getLangOpts()); 120b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis } else { 121b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis assert(!serialBufs.empty()); 1225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<llvm::MemoryBuffer *, 4> bufs; 123910ee57073f87b3f598971d4e96aff9dbf56a6c8Argyrios Kyrtzidis for (unsigned si = 0, se = serialBufs.size(); si != se; ++si) { 124b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis bufs.push_back(llvm::MemoryBuffer::getMemBufferCopy( 1255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef(serialBufs[si]->getBufferStart(), 126910ee57073f87b3f598971d4e96aff9dbf56a6c8Argyrios Kyrtzidis serialBufs[si]->getBufferSize()))); 127b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis } 128b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis std::string pchName = includes[i-1]; 129b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis llvm::raw_string_ostream os(pchName); 130b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis os << ".pch" << i-1; 131b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis os.flush(); 132c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner 133c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner serialBufNames.push_back(pchName); 134c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner 1356f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ExternalASTSource> Reader; 136c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner 137c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner Reader.reset(createASTReader(*Clang, pchName, bufs, serialBufNames, 138c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner Clang->getASTConsumer().GetASTDeserializationListener())); 139b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis if (!Reader) 140b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return 0; 141b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis Clang->getASTContext().setExternalSource(Reader); 142b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis } 143b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 144b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis if (!Clang->InitializeSourceManager(includes[i])) 145b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return 0; 146b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 147b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis ParseAST(Clang->getSema()); 148b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis OS.flush(); 1490ab547c284285e8abc31b30ded2226eb78c2af3bSebastian Redl Clang->getDiagnosticClient().EndSourceFile(); 150b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis serialBufs.push_back( 1515f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner llvm::MemoryBuffer::getMemBufferCopy(StringRef(serialAST.data(), 152b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis serialAST.size()))); 153b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis source->CIs.push_back(Clang.take()); 154b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis } 155b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 156b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis assert(!serialBufs.empty()); 157b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis std::string pchName = includes.back() + ".pch-final"; 158c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner serialBufNames.push_back(pchName); 1596f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ASTReader> Reader; 160c24a1eef40207457692a1ad597cefdd0dc8fa149Jonathan D. Turner Reader.reset(createASTReader(CI, pchName, serialBufs, serialBufNames)); 161b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis if (!Reader) 162b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return 0; 163b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 164b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis source->FinalReader.reset(Reader.take()); 165b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return source.take(); 166b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 167b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 168b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 169b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// ExternalASTSource interface. 170b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 171b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 172b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisDecl *ChainedIncludesSource::GetExternalDecl(uint32_t ID) { 173b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().GetExternalDecl(ID); 174b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 175b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisSelector ChainedIncludesSource::GetExternalSelector(uint32_t ID) { 176b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().GetExternalSelector(ID); 177b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 178b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisuint32_t ChainedIncludesSource::GetNumExternalSelectors() { 179b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().GetNumExternalSelectors(); 180b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 181b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisStmt *ChainedIncludesSource::GetExternalDeclStmt(uint64_t Offset) { 182b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().GetExternalDeclStmt(Offset); 183b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 184b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisCXXBaseSpecifier * 185b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 186b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().GetExternalCXXBaseSpecifiers(Offset); 187b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 188b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisDeclContextLookupResult 189b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios KyrtzidisChainedIncludesSource::FindExternalVisibleDeclsByName(const DeclContext *DC, 190b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis DeclarationName Name) { 191b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().FindExternalVisibleDeclsByName(DC, Name); 192b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 193ba6ffaf21e465c0926d7fc5fa294ea52f8d45fafDouglas GregorExternalLoadResult 194ba6ffaf21e465c0926d7fc5fa294ea52f8d45fafDouglas GregorChainedIncludesSource::FindExternalLexicalDecls(const DeclContext *DC, 195b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis bool (*isKindWeWant)(Decl::Kind), 1965f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<Decl*> &Result) { 197b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().FindExternalLexicalDecls(DC, isKindWeWant, Result); 198b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 199b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::CompleteType(TagDecl *Tag) { 200b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().CompleteType(Tag); 201b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 202b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::CompleteType(ObjCInterfaceDecl *Class) { 203b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().CompleteType(Class); 204b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 205b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::StartedDeserializing() { 206b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().StartedDeserializing(); 207b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 208b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::FinishedDeserializing() { 209b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().FinishedDeserializing(); 210b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 211b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::StartTranslationUnit(ASTConsumer *Consumer) { 212b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().StartTranslationUnit(Consumer); 213b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 214b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidisvoid ChainedIncludesSource::PrintStats() { 215b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis return getFinalReader().PrintStats(); 216b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis} 217e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenekvoid ChainedIncludesSource::getMemoryBufferSizes(MemoryBufferSizes &sizes)const{ 218e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek for (unsigned i = 0, e = CIs.size(); i != e; ++i) { 219e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek if (const ExternalASTSource *eSrc = 220e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek CIs[i]->getASTContext().getExternalSource()) { 221e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek eSrc->getMemoryBufferSizes(sizes); 222e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek } 223e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek } 224e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek 225e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek getFinalReader().getMemoryBufferSizes(sizes); 226e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek} 227ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl 228ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redlvoid ChainedIncludesSource::InitializeSema(Sema &S) { 229ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl return getFinalReader().InitializeSema(S); 230ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl} 231ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redlvoid ChainedIncludesSource::ForgetSema() { 232ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl return getFinalReader().ForgetSema(); 233ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl} 2345ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregorvoid ChainedIncludesSource::ReadMethodPool(Selector Sel) { 2355ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor getFinalReader().ReadMethodPool(Sel); 236ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl} 237ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redlbool ChainedIncludesSource::LookupUnqualified(LookupResult &R, Scope *S) { 238ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl return getFinalReader().LookupUnqualified(R, S); 239ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl} 240ce0682ff4647b885d41847b0f97918504282c2e8Sebastian Redl 241