]> granicus.if.org Git - clang/commitdiff
Allow loading declarations from any file in the chain. WIP
authorSebastian Redl <sebastian.redl@getdesigned.at>
Tue, 20 Jul 2010 22:46:15 +0000 (22:46 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Tue, 20 Jul 2010 22:46:15 +0000 (22:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108956 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/PCHReader.h
lib/Frontend/PCHReader.cpp
lib/Frontend/PCHReaderDecl.cpp

index 50a5ad5b1093297becd579893e09793a8b058261..4ef7bf19aa03d8915081b26f8f4821601dc870d5 100644 (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();
 
index 3abee836619330e909a4fa2f0e531ba7148089be..532ba444a2dafb9ea648f3ebbd2527dfbd7d20eb 100644 (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]);
   }
index e021d3cabab62b44d63247614093b5b659f0838c..a4c0d8df9a3170be2b373304150e7b852812c7e6 100644 (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;