From 0248f57d59a493124b378604cb084fde7b67adc7 Mon Sep 17 00:00:00 2001 From: "Jonathan D. Turner" Date: Fri, 5 Aug 2011 22:17:03 +0000 Subject: Wire up -import-module to run ReadAST for each module loaded. llvm-svn: 136987 --- clang/lib/Frontend/FrontendAction.cpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'clang/lib/Frontend/FrontendAction.cpp') 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(); -- cgit v1.2.3