aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Frontend')
-rw-r--r--lib/Frontend/PCHReader.cpp64
-rw-r--r--lib/Frontend/PCHWriter.cpp32
2 files changed, 60 insertions, 36 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index 3e612be629..897a0e7713 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -1802,21 +1802,21 @@ PCHReader::ReadPCHBlock(uint64_t &PreprocessorBlockOffset) {
break;
case pch::TYPE_OFFSET:
- if (!TypeOffsets.empty()) {
+ if (!TypesLoaded.empty()) {
Error("Duplicate TYPE_OFFSET record in PCH file");
return Failure;
}
- TypeOffsets.swap(Record);
- TypeAlreadyLoaded.resize(TypeOffsets.size(), false);
+ TypeOffsets = (const uint64_t *)BlobStart;
+ TypesLoaded.resize(Record[0]);
break;
case pch::DECL_OFFSET:
- if (!DeclOffsets.empty()) {
+ if (!DeclsLoaded.empty()) {
Error("Duplicate DECL_OFFSET record in PCH file");
return Failure;
}
- DeclOffsets.swap(Record);
- DeclAlreadyLoaded.resize(DeclOffsets.size(), false);
+ DeclOffsets = (const uint64_t *)BlobStart;
+ DeclsLoaded.resize(Record[0]);
break;
case pch::LANGUAGE_OPTIONS:
@@ -2340,9 +2340,8 @@ QualType PCHReader::ReadTypeRecord(uint64_t Offset) {
/// so that future GetDecl calls will return this declaration rather
/// than trying to load a new declaration.
inline void PCHReader::LoadedDecl(unsigned Index, Decl *D) {
- assert(!DeclAlreadyLoaded[Index] && "Decl loaded twice?");
- DeclAlreadyLoaded[Index] = true;
- DeclOffsets[Index] = reinterpret_cast<uint64_t>(D);
+ assert(!DeclsLoaded[Index] && "Decl loaded twice?");
+ DeclsLoaded[Index] = D;
}
/// \brief Determine whether the consumer will be interested in seeing
@@ -2591,27 +2590,26 @@ QualType PCHReader::GetType(pch::TypeID ID) {
}
Index -= pch::NUM_PREDEF_TYPE_IDS;
- if (!TypeAlreadyLoaded[Index]) {
- // Load the type from the PCH file.
- TypeOffsets[Index] = reinterpret_cast<uint64_t>(
- ReadTypeRecord(TypeOffsets[Index]).getTypePtr());
- TypeAlreadyLoaded[Index] = true;
- }
+ if (!TypesLoaded[Index])
+ TypesLoaded[Index] = ReadTypeRecord(TypeOffsets[Index]).getTypePtr();
- return QualType(reinterpret_cast<Type *>(TypeOffsets[Index]), Quals);
+ return QualType(TypesLoaded[Index], Quals);
}
Decl *PCHReader::GetDecl(pch::DeclID ID) {
if (ID == 0)
return 0;
+ if (ID > DeclsLoaded.size()) {
+ Error("Declaration ID out-of-range for PCH file");
+ return 0;
+ }
+
unsigned Index = ID - 1;
- assert(Index < DeclAlreadyLoaded.size() && "Declaration ID out of range");
- if (DeclAlreadyLoaded[Index])
- return reinterpret_cast<Decl *>(DeclOffsets[Index]);
+ if (!DeclsLoaded[Index])
+ ReadDeclRecord(DeclOffsets[Index], Index);
- // Load the declaration from the PCH file.
- return ReadDeclRecord(DeclOffsets[Index], Index);
+ return DeclsLoaded[Index];
}
Stmt *PCHReader::GetStmt(uint64_t Offset) {
@@ -2712,12 +2710,12 @@ void PCHReader::StartTranslationUnit(ASTConsumer *Consumer) {
void PCHReader::PrintStats() {
std::fprintf(stderr, "*** PCH Statistics:\n");
- unsigned NumTypesLoaded = std::count(TypeAlreadyLoaded.begin(),
- TypeAlreadyLoaded.end(),
- true);
- unsigned NumDeclsLoaded = std::count(DeclAlreadyLoaded.begin(),
- DeclAlreadyLoaded.end(),
- true);
+ unsigned NumTypesLoaded =
+ TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
+ (Type *)0);
+ unsigned NumDeclsLoaded =
+ DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
+ (Decl *)0);
unsigned NumIdentifiersLoaded = 0;
for (unsigned I = 0; I < IdentifierData.size(); ++I) {
if ((IdentifierData[I] & 0x01) == 0)
@@ -2729,14 +2727,14 @@ void PCHReader::PrintStats() {
++NumSelectorsLoaded;
}
- if (!TypeAlreadyLoaded.empty())
+ if (!TypesLoaded.empty())
std::fprintf(stderr, " %u/%u types read (%f%%)\n",
- NumTypesLoaded, (unsigned)TypeAlreadyLoaded.size(),
- ((float)NumTypesLoaded/TypeAlreadyLoaded.size() * 100));
- if (!DeclAlreadyLoaded.empty())
+ NumTypesLoaded, (unsigned)TypesLoaded.size(),
+ ((float)NumTypesLoaded/TypesLoaded.size() * 100));
+ if (!DeclsLoaded.empty())
std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
- NumDeclsLoaded, (unsigned)DeclAlreadyLoaded.size(),
- ((float)NumDeclsLoaded/DeclAlreadyLoaded.size() * 100));
+ NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
+ ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
if (!IdentifierData.empty())
std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
NumIdentifiersLoaded, (unsigned)IdentifierData.size(),
diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp
index 56c8296c94..91ddbf4182 100644
--- a/lib/Frontend/PCHWriter.cpp
+++ b/lib/Frontend/PCHWriter.cpp
@@ -2270,6 +2270,8 @@ PCHWriter::PCHWriter(llvm::BitstreamWriter &Stream)
NumVisibleDeclContexts(0) { }
void PCHWriter::WritePCH(Sema &SemaRef) {
+ using namespace llvm;
+
ASTContext &Context = SemaRef.Context;
Preprocessor &PP = SemaRef.PP;
@@ -2315,7 +2317,7 @@ void PCHWriter::WritePCH(Sema &SemaRef) {
// Write the remaining PCH contents.
RecordData Record;
- Stream.EnterSubblock(pch::PCH_BLOCK_ID, 3);
+ Stream.EnterSubblock(pch::PCH_BLOCK_ID, 4);
WriteTargetTriple(Context.Target);
WriteLanguageOptions(Context.getLangOptions());
WriteSourceManagerBlock(Context.getSourceManager());
@@ -2324,8 +2326,32 @@ void PCHWriter::WritePCH(Sema &SemaRef) {
WriteDeclsBlock(Context);
WriteMethodPool(SemaRef);
WriteIdentifierTable(PP);
- Stream.EmitRecord(pch::TYPE_OFFSET, TypeOffsets);
- Stream.EmitRecord(pch::DECL_OFFSET, DeclOffsets);
+
+ // Write the type offsets array
+ BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
+ Abbrev->Add(BitCodeAbbrevOp(pch::TYPE_OFFSET));
+ Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of types
+ Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // types block
+ unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
+ Record.clear();
+ Record.push_back(pch::TYPE_OFFSET);
+ Record.push_back(TypeOffsets.size());
+ Stream.EmitRecordWithBlob(TypeOffsetAbbrev, Record,
+ (const char *)&TypeOffsets.front(),
+ TypeOffsets.size() * sizeof(uint64_t));
+
+ // Write the declaration offsets array
+ Abbrev = new BitCodeAbbrev();
+ Abbrev->Add(BitCodeAbbrevOp(pch::DECL_OFFSET));
+ Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of declarations
+ Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // declarations block
+ unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
+ Record.clear();
+ Record.push_back(pch::DECL_OFFSET);
+ Record.push_back(DeclOffsets.size());
+ Stream.EmitRecordWithBlob(DeclOffsetAbbrev, Record,
+ (const char *)&DeclOffsets.front(),
+ DeclOffsets.size() * sizeof(uint64_t));
// Write the record of special types.
Record.clear();