Allow loading declarations from any file in the chain. WIP

llvm-svn: 108956
This commit is contained in:
Sebastian Redl 2010-07-20 22:46:15 +00:00
parent 41ff5d4d91
commit 3462779369
3 changed files with 21 additions and 6 deletions

View File

@ -548,7 +548,8 @@ private:
QualType ReadTypeRecord(unsigned Index);
RecordLocation TypeCursorForIndex(unsigned Index);
void LoadedDecl(unsigned Index, Decl *D);
Decl *ReadDeclRecord(uint64_t Offset, unsigned Index);
Decl *ReadDeclRecord(unsigned Index);
RecordLocation DeclCursorForIndex(unsigned Index);
void PassInterestingDeclsToConsumer();

View File

@ -2805,7 +2805,7 @@ Decl *PCHReader::GetExternalDecl(uint32_t ID) {
TranslationUnitDecl *PCHReader::GetTranslationUnitDecl() {
if (!DeclsLoaded[0]) {
ReadDeclRecord(Chain[0]->DeclOffsets[0], 0);
ReadDeclRecord(0);
if (DeserializationListener)
DeserializationListener->DeclRead(1, DeclsLoaded[0]);
}
@ -2824,7 +2824,7 @@ Decl *PCHReader::GetDecl(pch::DeclID ID) {
unsigned Index = ID - 1;
if (!DeclsLoaded[Index]) {
ReadDeclRecord(Chain[0]->DeclOffsets[Index], Index);
ReadDeclRecord(Index);
if (DeserializationListener)
DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
}

View File

@ -1254,9 +1254,23 @@ static bool isConsumerInterestedIn(Decl *D) {
return isa<ObjCProtocolDecl>(D);
}
/// \brief Get the correct cursor and offset for loading a type.
PCHReader::RecordLocation PCHReader::DeclCursorForIndex(unsigned Index) {
PerFileData *F = 0;
for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
F = Chain[N - I - 1];
if (Index < F->LocalNumDecls)
break;
Index -= F->LocalNumDecls;
}
assert(F && F->LocalNumDecls > Index && "Broken chain");
return RecordLocation(F->DeclsCursor, F->DeclOffsets[Index]);
}
/// \brief Read the declaration at the given offset from the PCH file.
Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
llvm::BitstreamCursor &DeclsCursor = Chain[0]->DeclsCursor;
Decl *PCHReader::ReadDeclRecord(unsigned Index) {
RecordLocation Loc = DeclCursorForIndex(Index);
llvm::BitstreamCursor &DeclsCursor = Loc.first;
// Keep track of where we are in the stream, then jump back there
// after reading this declaration.
SavedStreamPosition SavedPosition(DeclsCursor);
@ -1266,7 +1280,7 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
// Note that we are loading a declaration record.
LoadingTypeOrDecl Loading(*this);
DeclsCursor.JumpToBit(Offset);
DeclsCursor.JumpToBit(Loc.second);
RecordData Record;
unsigned Code = DeclsCursor.ReadCode();
unsigned Idx = 0;