diff options
author | Ted Kremenek <kremenek@apple.com> | 2007-12-04 19:39:02 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2007-12-04 19:39:02 +0000 |
commit | e21272fbdbfbf5bf3461d3e9b42279f4d47caa42 (patch) | |
tree | f06cdec1343d407482a9fd105c137d4d24178b8e /Basic/SourceManager.cpp | |
parent | 04b38243599e36debea430ff14fde4730db2fcd6 (diff) |
Implemented serialization of SrcMgr::ContentCache.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44578 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Basic/SourceManager.cpp')
-rw-r--r-- | Basic/SourceManager.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
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<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); +} |