diff --git a/clang/include/clang/Frontend/ChainedIncludesSource.h b/clang/include/clang/Frontend/ChainedIncludesSource.h deleted file mode 100644 index 676e749fb153..000000000000 --- a/clang/include/clang/Frontend/ChainedIncludesSource.h +++ /dev/null @@ -1,75 +0,0 @@ -//===- ChainedIncludesSource.h - Chained PCHs in Memory ---------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines the ChainedIncludesSource class, which converts headers -// to chained PCHs in memory, mainly used for testing. -// -//===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_SERIALIZATION_CHAINEDINCLUDESSOURCE_H -#define LLVM_CLANG_SERIALIZATION_CHAINEDINCLUDESSOURCE_H - -#include "clang/Sema/ExternalSemaSource.h" -#include - -namespace clang { - class CompilerInstance; - -class ChainedIncludesSource : public ExternalSemaSource { -public: - virtual ~ChainedIncludesSource(); - - static IntrusiveRefCntPtr create(CompilerInstance &CI); - - ExternalSemaSource &getFinalReader() const { return *FinalReader; } - -private: - std::vector CIs; - IntrusiveRefCntPtr FinalReader; - - -protected: - -//===----------------------------------------------------------------------===// -// ExternalASTSource interface. -//===----------------------------------------------------------------------===// - - Decl *GetExternalDecl(uint32_t ID) override; - Selector GetExternalSelector(uint32_t ID) override; - uint32_t GetNumExternalSelectors() override; - Stmt *GetExternalDeclStmt(uint64_t Offset) override; - CXXBaseSpecifier *GetExternalCXXBaseSpecifiers(uint64_t Offset) override; - bool FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name) override; - ExternalLoadResult FindExternalLexicalDecls(const DeclContext *DC, - bool (*isKindWeWant)(Decl::Kind), - SmallVectorImpl &Result) override; - void CompleteType(TagDecl *Tag) override; - void CompleteType(ObjCInterfaceDecl *Class) override; - void StartedDeserializing() override; - void FinishedDeserializing() override; - void StartTranslationUnit(ASTConsumer *Consumer) override; - void PrintStats() override; - - /// Return the amount of memory used by memory buffers, breaking down - /// by heap-backed versus mmap'ed memory. - void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override; - -//===----------------------------------------------------------------------===// -// ExternalSemaSource interface. -//===----------------------------------------------------------------------===// - - void InitializeSema(Sema &S) override; - void ForgetSema() override; - void ReadMethodPool(Selector Sel) override; - bool LookupUnqualified(LookupResult &R, Scope *S) override; -}; - -} - -#endif diff --git a/clang/include/clang/Frontend/Utils.h b/clang/include/clang/Frontend/Utils.h index eb417320b905..4c0a7b7a9c66 100644 --- a/clang/include/clang/Frontend/Utils.h +++ b/clang/include/clang/Frontend/Utils.h @@ -39,6 +39,7 @@ class Decl; class DependencyOutputOptions; class DiagnosticsEngine; class DiagnosticOptions; +class ExternalSemaSource; class FileManager; class HeaderSearch; class HeaderSearchOptions; @@ -162,6 +163,12 @@ void AttachHeaderIncludeGen(Preprocessor &PP, bool ShowAllHeaders = false, /// a seekable stream. void CacheTokens(Preprocessor &PP, llvm::raw_fd_ostream* OS); +/// The ChainedIncludesSource class converts headers to chained PCHs in +/// memory, mainly for testing. +IntrusiveRefCntPtr +createChainedIncludesSource(CompilerInstance &CI, + IntrusiveRefCntPtr &Reader); + /// createInvocationFromCommandLine - Construct a compiler invocation object for /// a command line argument vector. /// diff --git a/clang/lib/Frontend/ChainedIncludesSource.cpp b/clang/lib/Frontend/ChainedIncludesSource.cpp index 387f67118e95..e6e73ac963fb 100644 --- a/clang/lib/Frontend/ChainedIncludesSource.cpp +++ b/clang/lib/Frontend/ChainedIncludesSource.cpp @@ -12,7 +12,6 @@ // //===----------------------------------------------------------------------===// -#include "clang/Frontend/ChainedIncludesSource.h" #include "clang/Basic/TargetInfo.h" #include "clang/Frontend/ASTUnit.h" #include "clang/Frontend/CompilerInstance.h" @@ -25,6 +24,54 @@ using namespace clang; +namespace { +class ChainedIncludesSource : public ExternalSemaSource { +public: + virtual ~ChainedIncludesSource(); + + ExternalSemaSource &getFinalReader() const { return *FinalReader; } + + std::vector CIs; + IntrusiveRefCntPtr FinalReader; + +protected: + //===----------------------------------------------------------------------===// + // ExternalASTSource interface. + //===----------------------------------------------------------------------===// + + Decl *GetExternalDecl(uint32_t ID) override; + Selector GetExternalSelector(uint32_t ID) override; + uint32_t GetNumExternalSelectors() override; + Stmt *GetExternalDeclStmt(uint64_t Offset) override; + CXXBaseSpecifier *GetExternalCXXBaseSpecifiers(uint64_t Offset) override; + bool FindExternalVisibleDeclsByName(const DeclContext *DC, + DeclarationName Name) override; + ExternalLoadResult + FindExternalLexicalDecls(const DeclContext *DC, + bool (*isKindWeWant)(Decl::Kind), + SmallVectorImpl &Result) override; + void CompleteType(TagDecl *Tag) override; + void CompleteType(ObjCInterfaceDecl *Class) override; + void StartedDeserializing() override; + void FinishedDeserializing() override; + void StartTranslationUnit(ASTConsumer *Consumer) override; + void PrintStats() override; + + /// Return the amount of memory used by memory buffers, breaking down + /// by heap-backed versus mmap'ed memory. + void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override; + + //===----------------------------------------------------------------------===// + // ExternalSemaSource interface. + //===----------------------------------------------------------------------===// + + void InitializeSema(Sema &S) override; + void ForgetSema() override; + void ReadMethodPool(Selector Sel) override; + bool LookupUnqualified(LookupResult &R, Scope *S) override; +}; +} + static ASTReader * createASTReader(CompilerInstance &CI, StringRef pchFile, SmallVectorImpl &memBufs, @@ -62,8 +109,8 @@ ChainedIncludesSource::~ChainedIncludesSource() { delete CIs[i]; } -IntrusiveRefCntPtr -ChainedIncludesSource::create(CompilerInstance &CI) { +IntrusiveRefCntPtr clang::createChainedIncludesSource( + CompilerInstance &CI, IntrusiveRefCntPtr &Reader) { std::vector &includes = CI.getPreprocessorOpts().ChainedIncludes; assert(!includes.empty() && "No '-chain-include' in options!"); @@ -156,7 +203,6 @@ ChainedIncludesSource::create(CompilerInstance &CI) { assert(!serialBufs.empty()); std::string pchName = includes.back() + ".pch-final"; serialBufNames.push_back(pchName); - IntrusiveRefCntPtr Reader; Reader = createASTReader(CI, pchName, serialBufs, serialBufNames); if (!Reader) return nullptr; diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index 1cf4a79fd2f4..c274ba71768c 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -12,7 +12,6 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/DeclGroup.h" #include "clang/Frontend/ASTUnit.h" -#include "clang/Frontend/ChainedIncludesSource.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendDiagnostic.h" #include "clang/Frontend/FrontendPluginRegistry.h" @@ -315,13 +314,12 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI, if (!CI.getPreprocessorOpts().ChainedIncludes.empty()) { // Convert headers to PCH and chain them. - IntrusiveRefCntPtr source; - source = ChainedIncludesSource::create(CI); + IntrusiveRefCntPtr source, FinalReader; + source = createChainedIncludesSource(CI, FinalReader); if (!source) goto failure; - CI.setModuleManager(static_cast(&source->getFinalReader())); + CI.setModuleManager(static_cast(FinalReader.get())); CI.getASTContext().setExternalSource(source); - } else if (!CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) { // Use PCH. assert(hasPCHSupport() && "This action does not have PCH support!");