Wire up -import-module to run ReadAST for each module loaded.
llvm-svn: 136987
This commit is contained in:
parent
3d0b3a3a50
commit
0248f57d59
|
@ -41,6 +41,7 @@ class PreprocessorOptions {
|
||||||
public:
|
public:
|
||||||
std::vector<std::pair<std::string, bool/*isUndef*/> > Macros;
|
std::vector<std::pair<std::string, bool/*isUndef*/> > Macros;
|
||||||
std::vector<std::string> Includes;
|
std::vector<std::string> Includes;
|
||||||
|
std::vector<std::string> Modules;
|
||||||
std::vector<std::string> MacroIncludes;
|
std::vector<std::string> MacroIncludes;
|
||||||
|
|
||||||
unsigned UsePredefines : 1; /// Initialize the preprocessor with the compiler
|
unsigned UsePredefines : 1; /// Initialize the preprocessor with the compiler
|
||||||
|
|
|
@ -775,6 +775,10 @@ static void PreprocessorOptsToArgs(const PreprocessorOptions &Opts,
|
||||||
Res.push_back("-include");
|
Res.push_back("-include");
|
||||||
Res.push_back(Opts.Includes[i]);
|
Res.push_back(Opts.Includes[i]);
|
||||||
}
|
}
|
||||||
|
for (unsigned i = 0, e = Opts.Modules.size(); i != e; ++i) {
|
||||||
|
Res.push_back("-import_module");
|
||||||
|
Res.push_back(Opts.Modules[i]);
|
||||||
|
}
|
||||||
for (unsigned i = 0, e = Opts.MacroIncludes.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Opts.MacroIncludes.size(); i != e; ++i) {
|
||||||
Res.push_back("-imacros");
|
Res.push_back("-imacros");
|
||||||
Res.push_back(Opts.MacroIncludes[i]);
|
Res.push_back(Opts.MacroIncludes[i]);
|
||||||
|
@ -1807,6 +1811,12 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
|
||||||
Opts.ChainedIncludes.push_back(A->getValue(Args));
|
Opts.ChainedIncludes.push_back(A->getValue(Args));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (arg_iterator it = Args.filtered_begin(OPT_import_module),
|
||||||
|
ie = Args.filtered_end(); it != ie; ++it) {
|
||||||
|
const Arg *A = *it;
|
||||||
|
Opts.Modules.push_back(A->getValue(Args));
|
||||||
|
}
|
||||||
|
|
||||||
// Include 'altivec.h' if -faltivec option present
|
// Include 'altivec.h' if -faltivec option present
|
||||||
if (Args.hasArg(OPT_faltivec))
|
if (Args.hasArg(OPT_faltivec))
|
||||||
Opts.Includes.push_back("altivec.h");
|
Opts.Includes.push_back("altivec.h");
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "clang/Frontend/MultiplexConsumer.h"
|
#include "clang/Frontend/MultiplexConsumer.h"
|
||||||
#include "clang/Parse/ParseAST.h"
|
#include "clang/Parse/ParseAST.h"
|
||||||
#include "clang/Serialization/ASTDeserializationListener.h"
|
#include "clang/Serialization/ASTDeserializationListener.h"
|
||||||
|
#include "clang/Serialization/ASTReader.h"
|
||||||
#include "clang/Serialization/ChainedIncludesSource.h"
|
#include "clang/Serialization/ChainedIncludesSource.h"
|
||||||
#include "llvm/Support/MemoryBuffer.h"
|
#include "llvm/Support/MemoryBuffer.h"
|
||||||
#include "llvm/Support/Timer.h"
|
#include "llvm/Support/Timer.h"
|
||||||
|
@ -239,6 +240,30 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
||||||
DeserialListener);
|
DeserialListener);
|
||||||
if (!CI.getASTContext().getExternalSource())
|
if (!CI.getASTContext().getExternalSource())
|
||||||
goto failure;
|
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());
|
CI.setASTConsumer(Consumer.take());
|
||||||
|
@ -246,7 +271,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
||||||
goto failure;
|
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.
|
// source.
|
||||||
if (!CI.hasASTContext() || !CI.getASTContext().getExternalSource()) {
|
if (!CI.hasASTContext() || !CI.getASTContext().getExternalSource()) {
|
||||||
Preprocessor &PP = CI.getPreprocessor();
|
Preprocessor &PP = CI.getPreprocessor();
|
||||||
|
|
Loading…
Reference in New Issue