diff options
Diffstat (limited to 'clang/lib/Frontend/FrontendAction.cpp')
-rw-r--r-- | clang/lib/Frontend/FrontendAction.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index 89d95fc97d8..0753686a347 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -20,6 +20,7 @@ #include "clang/Frontend/MultiplexConsumer.h" #include "clang/Parse/ParseAST.h" #include "clang/Serialization/ASTDeserializationListener.h" +#include "clang/Serialization/ASTReader.h" #include "clang/Serialization/ChainedIncludesSource.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Timer.h" @@ -239,6 +240,30 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI, DeserialListener); if (!CI.getASTContext().getExternalSource()) goto failure; + } else if (!CI.getPreprocessorOpts().Modules.empty()) { + // Use PCH. + assert(hasPCHSupport() && "This action does not have PCH support!"); + ASTDeserializationListener *DeserialListener = + Consumer->GetASTDeserializationListener(); + if (CI.getPreprocessorOpts().DumpDeserializedPCHDecls) + DeserialListener = new DeserializedDeclsDumper(DeserialListener); + if (!CI.getPreprocessorOpts().DeserializedPCHDeclsToErrorOn.empty()) + DeserialListener = new DeserializedDeclsChecker(CI.getASTContext(), + CI.getPreprocessorOpts().DeserializedPCHDeclsToErrorOn, + DeserialListener); + + CI.createPCHExternalASTSource(CI.getPreprocessorOpts().Modules[0], + true, true, DeserialListener); + + for (unsigned I = 1, E = CI.getPreprocessorOpts().Modules.size(); I != E; + ++I) { + + ASTReader *ModMgr = CI.getModuleManager(); + ModMgr->ReadAST(CI.getPreprocessorOpts().Modules[I], + serialization::MK_Module); + } + if (!CI.getASTContext().getExternalSource()) + goto failure; } CI.setASTConsumer(Consumer.take()); @@ -246,7 +271,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI, goto failure; } - // Initialize builtin info as long as we aren't using an external AST + // Initialize built-in info as long as we aren't using an external AST // source. if (!CI.hasASTContext() || !CI.getASTContext().getExternalSource()) { Preprocessor &PP = CI.getPreprocessor(); |