[modules] Store offset to LOCAL_REDECLARATIONS record relative to the current
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 24 Mar 2016 23:41:14 +0000 (23:41 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 24 Mar 2016 23:41:14 +0000 (23:41 +0000)
record rather than relative to the start of the bitcode file. Saves a couple of
bytes per LOCAL_REDECLARATIONS record (also makes diffs of llvm-bcanalyzer
output more useful when tracking down nondeterminism...).

llvm-svn: 264359

clang/lib/Serialization/ASTReaderDecl.cpp
clang/lib/Serialization/ASTWriterDecl.cpp

index e580eb0..573a13a 100644 (file)
@@ -38,6 +38,7 @@ namespace clang {
   class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> {
     ASTReader &Reader;
     ModuleFile &F;
+    uint64_t Offset;
     const DeclID ThisDeclID;
     const unsigned RawLocation;
     typedef ASTReader::RecordData RecordData;
@@ -199,9 +200,10 @@ namespace clang {
     FindExistingResult findExisting(NamedDecl *D);
 
   public:
-    ASTDeclReader(ASTReader &Reader, ModuleFile &F, DeclID thisDeclID,
-                  unsigned RawLocation, const RecordData &Record, unsigned &Idx)
-        : Reader(Reader), F(F), ThisDeclID(thisDeclID),
+    ASTDeclReader(ASTReader &Reader, ASTReader::RecordLocation Loc,
+                  DeclID thisDeclID, unsigned RawLocation,
+                  const RecordData &Record, unsigned &Idx)
+        : Reader(Reader), F(*Loc.F), Offset(Loc.Offset), ThisDeclID(thisDeclID),
           RawLocation(RawLocation), Record(Record), Idx(Idx),
           TypeIDForTypeDecl(0), NamedDeclForTagDecl(0),
           TypedefNameForLinkage(nullptr), HasPendingBody(false) {}
@@ -2224,6 +2226,9 @@ ASTDeclReader::VisitRedeclarable(Redeclarable<T> *D) {
       MergeWith = ReadDecl(Record, Idx/*, MergeWith*/);
 
     RedeclOffset = Record[Idx++];
+    // RedeclOffset is a delta relative to the start of this record.
+    if (RedeclOffset)
+      RedeclOffset = Offset - RedeclOffset;
   } else {
     // This declaration was not the first local declaration. Read the first
     // local declaration now, to trigger the import of other redeclarations.
@@ -3178,7 +3183,7 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) {
   RecordData Record;
   unsigned Code = DeclsCursor.ReadCode();
   unsigned Idx = 0;
-  ASTDeclReader Reader(*this, *Loc.F, ID, RawLocation, Record,Idx);
+  ASTDeclReader Reader(*this, Loc, ID, RawLocation, Record,Idx);
 
   Decl *D = nullptr;
   switch ((DeclCode)DeclsCursor.readRecord(Code, Record)) {
@@ -3471,7 +3476,8 @@ void ASTReader::loadDeclUpdateRecords(serialization::DeclID ID, Decl *D) {
       assert(RecCode == DECL_UPDATES && "Expected DECL_UPDATES record!");
 
       unsigned Idx = 0;
-      ASTDeclReader Reader(*this, *F, ID, 0, Record, Idx);
+      ASTDeclReader Reader(*this, RecordLocation(F, Offset), ID, 0, Record,
+                           Idx);
       Reader.UpdateDecl(D, *F, Record);
 
       // We might have made this declaration interesting. If so, remember that
index 6c81b9e..e22a94d 100644 (file)
@@ -1624,8 +1624,9 @@ void ASTDeclWriter::VisitRedeclarable(Redeclarable<T> *D) {
       if (LocalRedecls.empty())
         Record.push_back(0);
       else {
-        Record.push_back(Writer.Stream.GetCurrentBitNo());
+        auto Start = Writer.Stream.GetCurrentBitNo();
         Writer.Stream.EmitRecord(LOCAL_REDECLARATIONS, LocalRedecls);
+        Record.push_back(Writer.Stream.GetCurrentBitNo() - Start);
       }
     } else {
       Record.push_back(0);