Split the normal and chained PCH writing paths and add a tiny bit of implementation to the latter. WIP.

llvm-svn: 108200
This commit is contained in:
Sebastian Redl 2010-07-12 22:02:52 +00:00
parent d1d239f35c
commit 143413f8fb
2 changed files with 78 additions and 8 deletions

View File

@ -239,6 +239,11 @@ private:
void WriteDeclsBlockAbbrevs();
void WriteDecl(ASTContext &Context, Decl *D);
void WritePCHCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
const char* isysroot);
void WritePCHChain(Sema &SemaRef, MemorizeStatCalls *StatCalls,
const PCHReader *Chain, const char* isysroot);
public:
/// \brief Create a new precompiled header writer that outputs to
/// the given bitstream.

View File

@ -2083,11 +2083,6 @@ PCHWriter::PCHWriter(llvm::BitstreamWriter &Stream)
void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
const PCHReader *Chain, const char *isysroot) {
using namespace llvm;
ASTContext &Context = SemaRef.Context;
Preprocessor &PP = SemaRef.PP;
// Emit the file header.
Stream.Emit((unsigned)'C', 8);
Stream.Emit((unsigned)'P', 8);
@ -2096,6 +2091,19 @@ void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
WriteBlockInfoBlock();
if (Chain)
WritePCHChain(SemaRef, StatCalls, Chain, isysroot);
else
WritePCHCore(SemaRef, StatCalls, isysroot);
}
void PCHWriter::WritePCHCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
const char *isysroot) {
using namespace llvm;
ASTContext &Context = SemaRef.Context;
Preprocessor &PP = SemaRef.PP;
// The translation unit is the first declaration we'll emit.
DeclIDs[Context.getTranslationUnitDecl()] = 1;
DeclTypesToEmit.push(Context.getTranslationUnitDecl());
@ -2158,8 +2166,7 @@ void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
// Write the remaining PCH contents.
RecordData Record;
Stream.EnterSubblock(pch::PCH_BLOCK_ID, 5);
WriteMetadata(Context, Chain, isysroot);
if (!Chain)
WriteMetadata(Context, 0, isysroot);
WriteLanguageOptions(Context.getLangOptions());
if (StatCalls && !isysroot)
WriteStatCache(*StatCalls, isysroot);
@ -2269,6 +2276,64 @@ void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
Stream.ExitBlock();
}
void PCHWriter::WritePCHChain(Sema &SemaRef, MemorizeStatCalls *StatCalls,
const PCHReader *Chain, const char *isysroot) {
using namespace llvm;
ASTContext &Context = SemaRef.Context;
Preprocessor &PP = SemaRef.PP;
(void)PP;
RecordData Record;
Stream.EnterSubblock(pch::PCH_BLOCK_ID, 5);
WriteMetadata(Context, Chain, isysroot);
// FIXME: StatCache
// FIXME: Source manager block
// The special types are in the chained PCH.
// We don't start with the translation unit, but with its decls that
// don't come from the other PCH.
const TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
// FIXME: We don't want to iterate over everything here, because it needlessly
// deserializes the entire original PCH. Instead we only want to iterate over
// the stuff that's already there.
// All in good time, though.
for (DeclContext::decl_iterator I = TU->decls_begin(), E = TU->decls_end();
I != E; ++I) {
if ((*I)->getPCHLevel() == 0) {
(*I)->dump();
DeclTypesToEmit.push(*I);
}
}
Stream.EnterSubblock(pch::DECLTYPES_BLOCK_ID, 3);
WriteDeclsBlockAbbrevs();
while (!DeclTypesToEmit.empty()) {
DeclOrType DOT = DeclTypesToEmit.front();
DeclTypesToEmit.pop();
if (DOT.isType())
WriteType(DOT.getType());
else
WriteDecl(Context, DOT.getDecl());
}
Stream.ExitBlock();
// FIXME: Preprocessor
// FIXME: Method pool
// FIXME: Identifier table
// FIXME: Type offsets
// FIXME: Declaration offsets
// FIXME: External unnamed definitions
// FIXME: Tentative definitions
// FIXME: Unused static functions
// FIXME: Locally-scoped external definitions
// FIXME: ext_vector type names
// FIXME: Dynamic classes declarations
// FIXME: Statistics
Stream.ExitBlock();
}
void PCHWriter::AddSourceLocation(SourceLocation Loc, RecordData &Record) {
Record.push_back(Loc.getRawEncoding());
}