[cfe-commits] r44125 - /cfe/trunk/Driver/SerializationTest.cpp

Ted Kremenek kremenek at apple.com
Wed Nov 14 09:46:35 PST 2007


Author: kremenek
Date: Wed Nov 14 11:46:35 2007
New Revision: 44125

URL: http://llvm.org/viewvc/llvm-project?rev=44125&view=rev
Log:
SourceManager, IdentifierTable, Selectors are now serialized in their own
block separate from ASTContext. This block is serialized out AFTER writing out
ASTContext, but deserialized BEFORE reading in ASTContext. This permits the
optimization of the serialization of the IdentifierTable where we only write
out identifiers that are used.

This was needed because TagDecls are owned by Types, and TagDecls contain
identifiers. Thus types need to be written out first to register with the
serializer any identifiers they refer to (and hence need to be serialized out
with IdentifierTable).

Modified:
    cfe/trunk/Driver/SerializationTest.cpp

Modified: cfe/trunk/Driver/SerializationTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/SerializationTest.cpp?rev=44125&r1=44124&r2=44125&view=diff

==============================================================================
--- cfe/trunk/Driver/SerializationTest.cpp (original)
+++ cfe/trunk/Driver/SerializationTest.cpp Wed Nov 14 11:46:35 2007
@@ -45,7 +45,9 @@
   ASTContext* Context;
   std::list<Decl*> Decls;
   
-  enum { ContextBlock = 0x1, DeclBlock = 0x3 };
+  enum { BasicMetadataBlock,
+         ASTContextBlock,
+         DeclsBlock };
 
 public:  
   SerializationTest() : Context(NULL) {};
@@ -105,7 +107,7 @@
   //      Serialize the top-level decls.
   // ===---------------------------------------------------===/  
   
-  Sezr.EnterBlock(DeclBlock);
+  Sezr.EnterBlock(DeclsBlock);
   
   // Create a printer to "consume" our deserialized ASTS.
   ASTConsumer* Printer = CreateASTPrinter();
@@ -125,7 +127,14 @@
   //      Serialize the "Translation Unit" metadata.
   // ===---------------------------------------------------===/
 
-  Sezr.EnterBlock(ContextBlock);
+  // Emit ASTContext.
+  Sezr.EnterBlock(ASTContextBlock);  
+  llvm::cerr << "Serializing: ASTContext.\n";  
+  Sezr.EmitOwnedPtr(Context);  
+  Sezr.ExitBlock();  
+  
+  
+  Sezr.EnterBlock(BasicMetadataBlock);
 
   // "Fake" emit the SourceManager.
   llvm::cerr << "Faux-serializing: SourceManager.\n";
@@ -142,11 +151,7 @@
   // Emit the Identifier Table.
   llvm::cerr << "Serializing: IdentifierTable.\n";  
   Sezr.EmitOwnedPtr(&Context->Idents);
-  
-  // Emit the ASTContext.
-  llvm::cerr << "Serializing: ASTContext.\n";  
-  Sezr.EmitOwnedPtr(Context);
-  
+
   Sezr.ExitBlock();  
   
   // ===---------------------------------------------------===/
@@ -207,8 +212,16 @@
   //      Deserialize the "Translation Unit" metadata.
   // ===---------------------------------------------------===/
   
-  // Skip to the block that has the SourceManager, etc.
-  bool FoundBlock = Dezr.SkipToBlock(ContextBlock);
+  // Skip to the BasicMetaDataBlock.  First jump to ASTContextBlock
+  // (which will appear earlier) and record its location.
+  
+  bool FoundBlock = Dezr.SkipToBlock(ASTContextBlock);
+  assert (FoundBlock);
+
+  llvm::Deserializer::Location ASTContextBlockLoc =
+    Dezr.getCurrentBlockLocation();
+  
+  FoundBlock = Dezr.SkipToBlock(BasicMetadataBlock);
   assert (FoundBlock);
   
   // "Fake" read the SourceManager.
@@ -227,6 +240,9 @@
   llvm::cerr << "Deserializing: IdentifierTable\n";
   Dezr.ReadOwnedPtr<IdentifierTable>();
   
+  // Now jump back to ASTContextBlock and read the ASTContext.
+  Dezr.JumpTo(ASTContextBlockLoc);
+  
   // Read the ASTContext.  
   llvm::cerr << "Deserializing: ASTContext.\n";
   Dezr.ReadOwnedPtr<ASTContext>();
@@ -237,7 +253,7 @@
   
   // "Rewind" the stream.  Find the block with the serialized top-level decls.
   Dezr.Rewind();
-  FoundBlock = Dezr.SkipToBlock(DeclBlock);
+  FoundBlock = Dezr.SkipToBlock(DeclsBlock);
   assert (FoundBlock);
   llvm::Deserializer::Location DeclBlockLoc = Dezr.getCurrentBlockLocation();
   





More information about the cfe-commits mailing list