[cfe-commits] r69991 - /cfe/trunk/lib/Frontend/PCHWriter.cpp

Douglas Gregor dgregor at apple.com
Fri Apr 24 14:49:03 PDT 2009


Author: dgregor
Date: Fri Apr 24 16:49:02 2009
New Revision: 69991

URL: http://llvm.org/viewvc/llvm-project?rev=69991&view=rev
Log:
Fix two small but very nasty bugs in the PCH writer for method pools:
  (1) Make sure to pad on-disk hash tables with 4 bytes, not 2, since
  the reader assumes that bucket data is aligned on 4-byte
  boundaries. 
  (2) Don't emit the number of factory methods twice. This was
  throwing off the data counts and therefore causing lookups to
  fail. I've added asserts so that this class of error cannot happen
  again.

Modified:
    cfe/trunk/lib/Frontend/PCHWriter.cpp

Modified: cfe/trunk/lib/Frontend/PCHWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHWriter.cpp?rev=69991&r1=69990&r2=69991&view=diff

==============================================================================
--- cfe/trunk/lib/Frontend/PCHWriter.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHWriter.cpp Fri Apr 24 16:49:02 2009
@@ -1816,10 +1816,11 @@
     return std::make_pair(KeyLen, DataLen);
   }
   
-  void EmitKey(llvm::raw_ostream& Out, Selector Sel, unsigned) {
+  void EmitKey(llvm::raw_ostream& Out, Selector Sel, unsigned KeyLen) {
     // FIXME: Keep track of the location of the key data (the
     // selector), so we can fold the selector table's storage into
     // this hash table.
+    uint64_t Start = Out.tell(); (void)Start;
     unsigned N = Sel.getNumArgs();
     clang::io::Emit16(Out, N);
     if (N == 0)
@@ -1827,10 +1828,13 @@
     for (unsigned I = 0; I != N; ++I)
       clang::io::Emit32(Out, 
                     Writer.getIdentifierRef(Sel.getIdentifierInfoForSlot(I)));
+    
+    assert(Out.tell() - Start == KeyLen && "Key length is wrong");
   }
   
   void EmitData(llvm::raw_ostream& Out, key_type_ref,
-                data_type_ref Methods, unsigned) {
+                data_type_ref Methods, unsigned DataLen) {
+    uint64_t Start = Out.tell(); (void)Start;
     unsigned NumInstanceMethods = 0;
     for (const ObjCMethodList *Method = &Methods.first; Method; 
          Method = Method->Next)
@@ -1849,11 +1853,12 @@
          Method = Method->Next)
       if (Method->Method)
         clang::io::Emit32(Out, Writer.getDeclID(Method->Method));
-    clang::io::Emit16(Out, NumFactoryMethods);
     for (const ObjCMethodList *Method = &Methods.second; Method; 
          Method = Method->Next)
       if (Method->Method)
         clang::io::Emit32(Out, Writer.getDeclID(Method->Method));
+
+    assert(Out.tell() - Start == DataLen && "Data length is wrong");
   }
 };
 } // end anonymous namespace
@@ -1922,7 +1927,7 @@
       PCHMethodPoolTrait Trait(*this);
       llvm::raw_svector_ostream Out(MethodPool);
       // Make sure that no bucket is at offset 0
-      clang::io::Emit16(Out, 0);
+      clang::io::Emit32(Out, 0);
       BucketOffset = Generator.Emit(Out, Trait);
     }
 
@@ -2051,7 +2056,7 @@
       PCHIdentifierTableTrait Trait(*this, PP);
       llvm::raw_svector_ostream Out(IdentifierTable);
       // Make sure that no bucket is at offset 0
-      clang::io::Emit16(Out, 0);
+      clang::io::Emit32(Out, 0);
       BucketOffset = Generator.Emit(Out, Trait);
     }
 





More information about the cfe-commits mailing list