]> granicus.if.org Git - clang/commitdiff
Implemented serialization of SrcMgr::ContentCache.
authorTed Kremenek <kremenek@apple.com>
Tue, 4 Dec 2007 19:39:02 +0000 (19:39 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 4 Dec 2007 19:39:02 +0000 (19:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44578 91177308-0d34-0410-b5e6-96231b3b80d8

Basic/SourceManager.cpp
include/clang/Basic/SourceManager.h

index 03fa203b2e5eb0c3c25bd8e76c725fc367d67a03..0b3af9853fbb25f194ae003f540bbd1274ebdfe1 100644 (file)
@@ -406,3 +406,57 @@ void SourceManager::PrintStats() const {
   std::cerr << NumFileBytesMapped << " bytes of files mapped, "
             << NumLineNumsComputed << " files with line #'s computed.\n";
 }
+
+//===----------------------------------------------------------------------===//
+// Serialization.
+//===----------------------------------------------------------------------===//
+
+void SrcMgr::ContentCache::Emit(llvm::Serializer& S,
+                                bool StoreBufferName,
+                                bool StoreBufferContents) const {
+  S.FlushRecord();
+  S.EmitPtr(this);
+  
+  if (StoreBufferName)
+    S.EmitCStr(Buffer->getBufferIdentifier());
+  
+  if (StoreBufferContents) {
+    // Emit the contents of the memory buffer.
+    // FIXME: use abbreviations to optimize this.
+    S.FlushRecord();
+
+    const char* p = Buffer->getBufferStart();
+    const char* e = Buffer->getBufferEnd();
+    
+    S.EmitInt(p-e);    
+
+    for ( ; p != e; ++p)
+      S.EmitInt(*p);
+
+    S.FlushRecord();
+  }
+}
+
+void SrcMgr::ContentCache::Read(llvm::Deserializer& D,
+                                std::vector<char>* BufferNameBuf,
+                                bool ReadBufferContents) {
+  D.RegisterPtr(this);
+  const char* BufferName = "";
+  
+  if (BufferNameBuf) {
+    D.ReadCStr(*BufferNameBuf);
+    BufferName = &(*BufferNameBuf)[0];
+  }
+  
+  if (ReadBufferContents) {
+    char *BufferName = D.ReadCStr();    
+    unsigned Size = D.ReadInt();    
+    Buffer = MemoryBuffer::getNewUninitMemBuffer(Size,BufferName);
+    char* p = const_cast<char*>(Buffer->getBufferStart());
+    const char* e = Buffer->getBufferEnd();
+    for ( ; p != e ; ++p )
+      *p = (char) D.ReadInt();    
+  }
+  else
+    Buffer = MemoryBuffer::getNewUninitMemBuffer(0,BufferName);
+}
index 6798a21200c9828170f520d2ae883adeaf19935d..e019f0ecf49b74ff97a3d63856eb5d9efb6caed9 100644 (file)
@@ -71,6 +71,14 @@ namespace SrcMgr {
       NumLines = RHS.NumLines;      
     }
     
+    /// Emit - Emit this ContentCache to Bitcode.
+    void Emit(llvm::Serializer& S, bool StoreBufferName,
+              bool StoreBufferContents) const;
+    
+    /// Read - Reconstitute a ContentCache from Bitcode.
+    void Read(llvm::Deserializer& D, std::vector<char>* BufferNameBuf,
+              bool ReadBufferContents);
+
   private:
     // Disable assignments.
     ContentCache& operator=(const ContentCache& RHS);