From: Ted Kremenek Date: Tue, 4 Dec 2007 19:39:02 +0000 (+0000) Subject: Implemented serialization of SrcMgr::ContentCache. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e21272fbdbfbf5bf3461d3e9b42279f4d47caa42;p=clang Implemented serialization of SrcMgr::ContentCache. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44578 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Basic/SourceManager.cpp b/Basic/SourceManager.cpp index 03fa203b2e..0b3af9853f 100644 --- a/Basic/SourceManager.cpp +++ b/Basic/SourceManager.cpp @@ -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* 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(Buffer->getBufferStart()); + const char* e = Buffer->getBufferEnd(); + for ( ; p != e ; ++p ) + *p = (char) D.ReadInt(); + } + else + Buffer = MemoryBuffer::getNewUninitMemBuffer(0,BufferName); +} diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h index 6798a21200..e019f0ecf4 100644 --- a/include/clang/Basic/SourceManager.h +++ b/include/clang/Basic/SourceManager.h @@ -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* BufferNameBuf, + bool ReadBufferContents); + private: // Disable assignments. ContentCache& operator=(const ContentCache& RHS);