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:
parent
d1d239f35c
commit
143413f8fb
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue