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
|
|
@ -238,6 +238,11 @@ private:
|
||||||
unsigned ParmVarDeclAbbrev;
|
unsigned ParmVarDeclAbbrev;
|
||||||
void WriteDeclsBlockAbbrevs();
|
void WriteDeclsBlockAbbrevs();
|
||||||
void WriteDecl(ASTContext &Context, Decl *D);
|
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:
|
public:
|
||||||
/// \brief Create a new precompiled header writer that outputs to
|
/// \brief Create a new precompiled header writer that outputs to
|
||||||
|
|
|
||||||
|
|
@ -2083,11 +2083,6 @@ PCHWriter::PCHWriter(llvm::BitstreamWriter &Stream)
|
||||||
|
|
||||||
void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
|
void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
|
||||||
const PCHReader *Chain, const char *isysroot) {
|
const PCHReader *Chain, const char *isysroot) {
|
||||||
using namespace llvm;
|
|
||||||
|
|
||||||
ASTContext &Context = SemaRef.Context;
|
|
||||||
Preprocessor &PP = SemaRef.PP;
|
|
||||||
|
|
||||||
// Emit the file header.
|
// Emit the file header.
|
||||||
Stream.Emit((unsigned)'C', 8);
|
Stream.Emit((unsigned)'C', 8);
|
||||||
Stream.Emit((unsigned)'P', 8);
|
Stream.Emit((unsigned)'P', 8);
|
||||||
|
|
@ -2096,6 +2091,19 @@ void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
|
||||||
|
|
||||||
WriteBlockInfoBlock();
|
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.
|
// The translation unit is the first declaration we'll emit.
|
||||||
DeclIDs[Context.getTranslationUnitDecl()] = 1;
|
DeclIDs[Context.getTranslationUnitDecl()] = 1;
|
||||||
DeclTypesToEmit.push(Context.getTranslationUnitDecl());
|
DeclTypesToEmit.push(Context.getTranslationUnitDecl());
|
||||||
|
|
@ -2158,9 +2166,8 @@ void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
|
||||||
// Write the remaining PCH contents.
|
// Write the remaining PCH contents.
|
||||||
RecordData Record;
|
RecordData Record;
|
||||||
Stream.EnterSubblock(pch::PCH_BLOCK_ID, 5);
|
Stream.EnterSubblock(pch::PCH_BLOCK_ID, 5);
|
||||||
WriteMetadata(Context, Chain, isysroot);
|
WriteMetadata(Context, 0, isysroot);
|
||||||
if (!Chain)
|
WriteLanguageOptions(Context.getLangOptions());
|
||||||
WriteLanguageOptions(Context.getLangOptions());
|
|
||||||
if (StatCalls && !isysroot)
|
if (StatCalls && !isysroot)
|
||||||
WriteStatCache(*StatCalls, isysroot);
|
WriteStatCache(*StatCalls, isysroot);
|
||||||
WriteSourceManagerBlock(Context.getSourceManager(), PP, isysroot);
|
WriteSourceManagerBlock(Context.getSourceManager(), PP, isysroot);
|
||||||
|
|
@ -2269,6 +2276,64 @@ void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
|
||||||
Stream.ExitBlock();
|
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) {
|
void PCHWriter::AddSourceLocation(SourceLocation Loc, RecordData &Record) {
|
||||||
Record.push_back(Loc.getRawEncoding());
|
Record.push_back(Loc.getRawEncoding());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue