[cfe-commits] r44471 - in /cfe/trunk: Basic/IdentifierTable.cpp Driver/SerializationTest.cpp include/clang/Basic/IdentifierTable.h

Ted Kremenek kremenek at apple.com
Fri Nov 30 14:46:56 PST 2007


Author: kremenek
Date: Fri Nov 30 16:46:56 2007
New Revision: 44471

URL: http://llvm.org/viewvc/llvm-project?rev=44471&view=rev
Log:
Implemented serialization of SelectorTable and Selectors.
Modified serialization of IdentifierTable to self-register itself with
the Deserializer.

Modified:
    cfe/trunk/Basic/IdentifierTable.cpp
    cfe/trunk/Driver/SerializationTest.cpp
    cfe/trunk/include/clang/Basic/IdentifierTable.h

Modified: cfe/trunk/Basic/IdentifierTable.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Basic/IdentifierTable.cpp?rev=44471&r1=44470&r2=44471&view=diff

==============================================================================
--- cfe/trunk/Basic/IdentifierTable.cpp (original)
+++ cfe/trunk/Basic/IdentifierTable.cpp Fri Nov 30 16:46:56 2007
@@ -258,6 +258,8 @@
 /// this class is provided strictly through Selector.
 namespace clang {
 class MultiKeywordSelector : public llvm::FoldingSetNode {
+  friend SelectorTable* SelectorTable::CreateAndRegister(llvm::Deserializer&);
+  MultiKeywordSelector(unsigned nKeys) : NumArgs(nKeys) {}
 public:  
   unsigned NumArgs;
 
@@ -265,11 +267,13 @@
   MultiKeywordSelector(unsigned nKeys, IdentifierInfo **IIV) {
     assert((nKeys > 1) && "not a multi-keyword selector");
     NumArgs = nKeys;
+    
     // Fill in the trailing keyword array.
     IdentifierInfo **KeyInfo = reinterpret_cast<IdentifierInfo **>(this+1);
     for (unsigned i = 0; i != nKeys; ++i)
       KeyInfo[i] = IIV[i];
-  }
+  }  
+  
   // getName - Derive the full selector name and return it.
   std::string getName() const;
     
@@ -422,6 +426,8 @@
 void IdentifierTable::Emit(llvm::Serializer& S) const {
   S.EnterBlock();
   
+  S.EmitPtr(this);
+  
   for (iterator I=begin(), E=end(); I != E; ++I) {
     const char* Key = I->getKeyData();
     const IdentifierInfo* Info = &I->getValue();
@@ -443,13 +449,14 @@
   S.ExitBlock();
 }
 
-IdentifierTable* IdentifierTable::Create(llvm::Deserializer& D) {
+IdentifierTable* IdentifierTable::CreateAndRegister(llvm::Deserializer& D) {
   llvm::Deserializer::Location BLoc = D.getCurrentBlockLocation();
 
   std::vector<char> buff;
   buff.reserve(200);
 
   IdentifierTable* t = new IdentifierTable();
+  D.RegisterPtr(t);  
   
   while (!D.FinishedBlock(BLoc)) {
     llvm::SerializedPtrID InfoPtrID = D.ReadPtrID();
@@ -471,3 +478,71 @@
   
   return t;
 }
+
+//===----------------------------------------------------------------------===//
+// Serialization for Selector and SelectorTable.
+//===----------------------------------------------------------------------===//
+
+void Selector::Emit(llvm::Serializer& S) const {
+  S.EmitInt(getIdentifierInfoFlag());
+  S.EmitPtr(reinterpret_cast<void*>(InfoPtr & ~ArgFlags));
+}
+
+Selector Selector::ReadVal(llvm::Deserializer& D) {
+  unsigned flag = D.ReadInt();
+  
+  uintptr_t ptr;  
+  D.ReadUIntPtr(ptr,false); // No backpatching.
+  
+  return Selector(ptr | flag);
+}
+
+void SelectorTable::Emit(llvm::Serializer& S) const {
+  typedef llvm::FoldingSet<MultiKeywordSelector>::iterator iterator;
+  llvm::FoldingSet<MultiKeywordSelector> *SelTab;
+  SelTab = static_cast<llvm::FoldingSet<MultiKeywordSelector> *>(Impl);
+  
+  S.EnterBlock();
+  
+  S.EmitPtr(this);
+  
+  for (iterator I=SelTab->begin(), E=SelTab->end(); I != E; ++I) {
+    S.FlushRecord(); // Start a new record.
+    S.EmitInt(I->getNumArgs());
+
+    for (MultiKeywordSelector::keyword_iterator KI = I->keyword_begin(),
+         KE = I->keyword_end(); KI != KE; ++KI)
+      S.EmitPtr(*KI);
+  }
+  
+  S.ExitBlock();
+}
+
+SelectorTable* SelectorTable::CreateAndRegister(llvm::Deserializer& D) {
+  llvm::Deserializer::Location BLoc = D.getCurrentBlockLocation();
+  
+  SelectorTable* t = new SelectorTable();
+  D.RegisterPtr(t);
+  
+  llvm::FoldingSet<MultiKeywordSelector>& SelTab =
+    *static_cast<llvm::FoldingSet<MultiKeywordSelector>*>(t->Impl);
+
+  while (!D.FinishedBlock(BLoc)) {
+    unsigned nKeys = D.ReadInt();
+    
+    MultiKeywordSelector *SI = 
+      (MultiKeywordSelector*)malloc(sizeof(MultiKeywordSelector) + 
+                                    nKeys*sizeof(IdentifierInfo *));
+
+    new (SI) MultiKeywordSelector(nKeys);
+
+    IdentifierInfo **KeyInfo = reinterpret_cast<IdentifierInfo **>(SI+1);
+
+    for (unsigned i = 0; i != nKeys; ++i)
+      D.ReadPtr(KeyInfo[i],false);
+    
+    SelTab.GetOrInsertNode(SI);
+  }
+  
+  return t;
+}

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

==============================================================================
--- cfe/trunk/Driver/SerializationTest.cpp (original)
+++ cfe/trunk/Driver/SerializationTest.cpp Fri Nov 30 16:46:56 2007
@@ -53,9 +53,9 @@
   ASTContext* Context;
   std::list<Decl*> Decls;
   
-  enum { BasicMetadataBlock,
-         ASTContextBlock,
-         DeclsBlock };
+  enum { BasicMetadataBlock = 1,
+         ASTContextBlock = 2,
+         DeclsBlock = 3 };
 
 public:  
   SerializationTest() : Context(NULL) {};
@@ -163,6 +163,10 @@
   
   Sezr.EnterBlock(BasicMetadataBlock);
 
+  // Block for SourceManager and Target.  Allows easy skipping around
+  // to the Selectors during deserialization.
+  Sezr.EnterBlock();
+
   // "Fake" emit the SourceManager.
   llvm::cerr << "Faux-serializing: SourceManager.\n";
   Sezr.EmitPtr(&Context->SourceMgr);
@@ -171,13 +175,15 @@
   llvm::cerr << "Faux-serializing: Target.\n";
   Sezr.EmitPtr(&Context->Target);
 
-  // "Fake" emit Selectors.
-  llvm::cerr << "Faux-serializing: Selectors.\n";
-  Sezr.EmitPtr(&Context->Selectors);
+  Sezr.ExitBlock();
+
+  // Emit the Selectors.
+  llvm::cerr << "Serializing: Selectors.\n";
+  Sezr.Emit(Context->Selectors);
   
   // Emit the Identifier Table.
   llvm::cerr << "Serializing: IdentifierTable.\n";  
-  Sezr.EmitOwnedPtr(&Context->Idents);
+  Sezr.Emit(Context->Idents);
 
   Sezr.ExitBlock();  
   
@@ -254,19 +260,23 @@
   llvm::cerr << "Faux-Deserializing: Target.\n";
   Dezr.RegisterPtr(&Context->Target);
 
-  // "Fake" read the Selectors.
-  llvm::cerr << "Faux-Deserializing: Selectors.\n";
-  Dezr.RegisterPtr(&Context->Selectors);  
+  // For Selectors, we must read the identifier table first because the
+  //  SelectorTable depends on the identifiers being already deserialized.
+  llvm::Deserializer::Location SelectorBlockLoc = Dezr.getCurrentBlockLocation();
+  Dezr.SkipBlock();
   
   // Read the identifier table.
   llvm::cerr << "Deserializing: IdentifierTable\n";
-  Dezr.ReadOwnedPtr<IdentifierTable>();
+  IdentifierTable::CreateAndRegister(Dezr);
   
-  // Now jump back to ASTContextBlock and read the ASTContext.
-  Dezr.JumpTo(ASTContextBlockLoc);
+  // Now jump back and read the selectors.
+  llvm::cerr << "Deserializing: Selectors\n";
+  Dezr.JumpTo(SelectorBlockLoc);
+  SelectorTable::CreateAndRegister(Dezr);
   
-  // Read the ASTContext.  
+  // Now jump back to ASTContextBlock and read the ASTContext.
   llvm::cerr << "Deserializing: ASTContext.\n";
+  Dezr.JumpTo(ASTContextBlockLoc);
   Dezr.ReadOwnedPtr<ASTContext>();
     
   // "Rewind" the stream.  Find the block with the serialized top-level decls.

Modified: cfe/trunk/include/clang/Basic/IdentifierTable.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/IdentifierTable.h?rev=44471&r1=44470&r2=44471&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/IdentifierTable.h (original)
+++ cfe/trunk/include/clang/Basic/IdentifierTable.h Fri Nov 30 16:46:56 2007
@@ -195,7 +195,7 @@
   void Emit(llvm::Serializer& S) const;
   
   /// Create - Deserialize an IdentifierTable from a bitstream.
-  static IdentifierTable* Create(llvm::Deserializer& D);
+  static IdentifierTable* CreateAndRegister(llvm::Deserializer& D);
   
 private:  
   /// This ctor is not intended to be used by anyone except for object
@@ -227,7 +227,7 @@
     InfoPtr = reinterpret_cast<uintptr_t>(SI);
     assert((InfoPtr & ArgFlags) == 0 &&"Insufficiently aligned IdentifierInfo");
   }
-  Selector(intptr_t V) : InfoPtr(V) {}
+  Selector(uintptr_t V) : InfoPtr(V) {}
 public:
   friend class SelectorTable; // only the SelectorTable can create these.
   
@@ -269,6 +269,12 @@
   static Selector getTombstoneMarker() {
     return Selector(uintptr_t(-2));
   }
+  
+  // Emit - Emit a selector to bitcode.
+  void Emit(llvm::Serializer& S) const;
+  
+  // ReadVal - Read a selector from bitcode.
+  static Selector ReadVal(llvm::Deserializer& D);
 };
 
 /// SelectorTable - This table allows us to fully hide how we implement
@@ -292,6 +298,12 @@
   Selector getNullarySelector(IdentifierInfo *ID) {
     return Selector(ID, 0);
   }
+  
+  // Emit - Emit a SelectorTable to bitcode.
+  void Emit(llvm::Serializer& S) const;
+  
+  // Create - Reconstitute a SelectorTable from bitcode.
+  static SelectorTable* CreateAndRegister(llvm::Deserializer& D);
 };
 
 }  // end namespace clang





More information about the cfe-commits mailing list