When writing a module file, pass the module through to the AST

writer. No functionality change.

llvm-svn: 145479
This commit is contained in:
Douglas Gregor 2011-11-30 04:39:39 +00:00
parent 1805b8a42f
commit f7a700fd01
7 changed files with 26 additions and 23 deletions

View File

@ -11,6 +11,7 @@
#define LLVM_CLANG_FRONTEND_FRONTENDACTIONS_H
#include "clang/Frontend/FrontendAction.h"
#include "clang/Lex/ModuleMap.h"
#include <string>
#include <vector>
@ -92,6 +93,8 @@ public:
};
class GenerateModuleAction : public ASTFrontendAction {
ModuleMap::Module *Module;
protected:
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
StringRef InFile);

View File

@ -18,6 +18,7 @@
#include "clang/AST/DeclarationName.h"
#include "clang/AST/TemplateBase.h"
#include "clang/AST/ASTMutationListener.h"
#include "clang/Lex/ModuleMap.h"
#include "clang/Serialization/ASTBitCodes.h"
#include "clang/Serialization/ASTDeserializationListener.h"
#include "clang/Sema/SemaConsumer.h"
@ -412,7 +413,7 @@ private:
void WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
StringRef isysroot, const std::string &OutputFile,
bool IsModule);
ModuleMap::Module *WritingModule);
public:
/// \brief Create a new precompiled header writer that outputs to
@ -428,14 +429,14 @@ public:
/// \param StatCalls the object that cached all of the stat() calls made while
/// searching for source files and headers.
///
/// \param IsModule Whether we're writing a module (otherwise, we're writing a
/// precompiled header).
/// \param WritingModule The module that we are writing. If null, we are
/// writing a precompiled header.
///
/// \param isysroot if non-empty, write a relocatable file whose headers
/// are relative to the given system root.
void WriteAST(Sema &SemaRef, MemorizeStatCalls *StatCalls,
const std::string &OutputFile,
bool IsModule, StringRef isysroot);
ModuleMap::Module *WritingModule, StringRef isysroot);
/// \brief Emit a source location.
void AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record);
@ -672,7 +673,7 @@ public:
class PCHGenerator : public SemaConsumer {
const Preprocessor &PP;
std::string OutputFile;
bool IsModule;
ModuleMap::Module *Module;
std::string isysroot;
raw_ostream *Out;
Sema *SemaPtr;
@ -687,7 +688,7 @@ protected:
public:
PCHGenerator(const Preprocessor &PP, StringRef OutputFile,
bool IsModule,
ModuleMap::Module *Module,
StringRef isysroot, raw_ostream *Out);
~PCHGenerator();
virtual void InitializeSema(Sema &S) { SemaPtr = &S; }

View File

@ -924,7 +924,7 @@ class PrecompilePreambleConsumer : public PCHGenerator {
public:
PrecompilePreambleConsumer(ASTUnit &Unit, const Preprocessor &PP,
StringRef isysroot, raw_ostream *Out)
: PCHGenerator(PP, "", /*IsModule=*/false, isysroot, Out), Unit(Unit),
: PCHGenerator(PP, "", 0, isysroot, Out), Unit(Unit),
Hash(Unit.getCurrentTopLevelHashValue()) {
Hash = 0;
}
@ -2423,7 +2423,7 @@ bool ASTUnit::serialize(raw_ostream &OS) {
llvm::BitstreamWriter Stream(Buffer);
ASTWriter Writer(Stream);
// FIXME: Handle modules
Writer.WriteAST(getSema(), 0, std::string(), /*IsModule=*/false, "");
Writer.WriteAST(getSema(), 0, std::string(), 0, "");
// Write the generated bitstream to "Out".
if (!Buffer.empty())

View File

@ -86,8 +86,7 @@ ASTConsumer *GeneratePCHAction::CreateASTConsumer(CompilerInstance &CI,
if (!CI.getFrontendOpts().RelocatablePCH)
Sysroot.clear();
return new PCHGenerator(CI.getPreprocessor(), OutputFile, /*Module=*/false,
Sysroot, OS);
return new PCHGenerator(CI.getPreprocessor(), OutputFile, 0, Sysroot, OS);
}
bool GeneratePCHAction::ComputeASTConsumerArguments(CompilerInstance &CI,
@ -122,7 +121,7 @@ ASTConsumer *GenerateModuleAction::CreateASTConsumer(CompilerInstance &CI,
if (ComputeASTConsumerArguments(CI, InFile, Sysroot, OutputFile, OS))
return 0;
return new PCHGenerator(CI.getPreprocessor(), OutputFile, /*MakeModule=*/true,
return new PCHGenerator(CI.getPreprocessor(), OutputFile, Module,
Sysroot, OS);
}
@ -184,8 +183,7 @@ bool GenerateModuleAction::BeginSourceFileAction(CompilerInstance &CI,
}
// Dig out the module definition.
ModuleMap::Module *Module = HS.getModule(CI.getLangOpts().CurrentModule,
/*AllowSearch=*/false);
Module = HS.getModule(CI.getLangOpts().CurrentModule, /*AllowSearch=*/false);
if (!Module) {
CI.getDiagnostics().Report(diag::err_missing_module)
<< CI.getLangOpts().CurrentModule << Filename;

View File

@ -2791,7 +2791,7 @@ ASTWriter::~ASTWriter() {
void ASTWriter::WriteAST(Sema &SemaRef, MemorizeStatCalls *StatCalls,
const std::string &OutputFile,
bool IsModule, StringRef isysroot) {
ModuleMap::Module *WritingModule, StringRef isysroot) {
WritingAST = true;
// Emit the file header.
@ -2803,7 +2803,7 @@ void ASTWriter::WriteAST(Sema &SemaRef, MemorizeStatCalls *StatCalls,
WriteBlockInfoBlock();
Context = &SemaRef.Context;
WriteASTCore(SemaRef, StatCalls, isysroot, OutputFile, IsModule);
WriteASTCore(SemaRef, StatCalls, isysroot, OutputFile, WritingModule);
Context = 0;
WritingAST = false;
@ -2820,7 +2820,8 @@ static void AddLazyVectorDecls(ASTWriter &Writer, Vector &Vec,
void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
StringRef isysroot,
const std::string &OutputFile, bool IsModule) {
const std::string &OutputFile,
ModuleMap::Module *WritingModule) {
using namespace llvm;
ASTContext &Context = SemaRef.Context;
@ -3086,11 +3087,11 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
Buffer.data(), Buffer.size());
}
WritePreprocessor(PP, IsModule);
WritePreprocessor(PP, WritingModule != 0);
WriteHeaderSearch(PP.getHeaderSearchInfo(), isysroot);
WriteSelectors(SemaRef);
WriteReferencedSelectorsPool(SemaRef);
WriteIdentifierTable(PP, SemaRef.IdResolver, IsModule);
WriteIdentifierTable(PP, SemaRef.IdResolver, WritingModule != 0);
WriteFPPragmaOptions(SemaRef.getFPOptions());
WriteOpenCLExtensions(SemaRef);

View File

@ -105,8 +105,8 @@ ChainedIncludesSource *ChainedIncludesSource::create(CompilerInstance &CI) {
SmallVector<char, 256> serialAST;
llvm::raw_svector_ostream OS(serialAST);
llvm::OwningPtr<ASTConsumer> consumer;
consumer.reset(new PCHGenerator(Clang->getPreprocessor(), "-",
/*IsModule=*/false, /*isysroot=*/"", &OS));
consumer.reset(new PCHGenerator(Clang->getPreprocessor(), "-", 0,
/*isysroot=*/"", &OS));
Clang->getASTContext().setASTMutationListener(
consumer->GetASTMutationListener());
Clang->setASTConsumer(consumer.take());

View File

@ -28,10 +28,10 @@ using namespace clang;
PCHGenerator::PCHGenerator(const Preprocessor &PP,
StringRef OutputFile,
bool IsModule,
ModuleMap::Module *Module,
StringRef isysroot,
raw_ostream *OS)
: PP(PP), OutputFile(OutputFile), IsModule(IsModule),
: PP(PP), OutputFile(OutputFile), Module(Module),
isysroot(isysroot.str()), Out(OS),
SemaPtr(0), StatCalls(0), Stream(Buffer), Writer(Stream) {
// Install a stat() listener to keep track of all of the stat()
@ -49,7 +49,7 @@ void PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) {
// Emit the PCH file
assert(SemaPtr && "No Sema?");
Writer.WriteAST(*SemaPtr, StatCalls, OutputFile, IsModule, isysroot);
Writer.WriteAST(*SemaPtr, StatCalls, OutputFile, Module, isysroot);
// Write the generated bitstream to "Out".
Out->write((char *)&Buffer.front(), Buffer.size());