diff options
Diffstat (limited to 'lib/Bitcode/Writer/Serialize.cpp')
| -rw-r--r-- | lib/Bitcode/Writer/Serialize.cpp | 118 | 
1 files changed, 118 insertions, 0 deletions
| diff --git a/lib/Bitcode/Writer/Serialize.cpp b/lib/Bitcode/Writer/Serialize.cpp new file mode 100644 index 0000000000000..79464a61be46a --- /dev/null +++ b/lib/Bitcode/Writer/Serialize.cpp @@ -0,0 +1,118 @@ +//==- Serialize.cpp - Generic Object Serialization to Bitcode ----*- C++ -*-==// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the internal methods used for object serialization. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Bitcode/Serialize.h" +#include "string.h" + +#ifdef DEBUG_BACKPATCH +#include "llvm/Support/Streams.h" +#endif + +using namespace llvm; + +Serializer::Serializer(BitstreamWriter& stream) +  : Stream(stream), BlockLevel(0) {} + +Serializer::~Serializer() { +  if (inRecord()) +    EmitRecord(); + +  while (BlockLevel > 0) +    Stream.ExitBlock(); +    +  Stream.FlushToWord(); +} + +void Serializer::EmitRecord() { +  assert(Record.size() > 0 && "Cannot emit empty record."); +  Stream.EmitRecord(8,Record); +  Record.clear(); +} + +void Serializer::EnterBlock(unsigned BlockID,unsigned CodeLen) { +  FlushRecord(); +  Stream.EnterSubblock(BlockID,CodeLen); +  ++BlockLevel; +} + +void Serializer::ExitBlock() { +  assert (BlockLevel > 0); +  --BlockLevel; +  FlushRecord(); +  Stream.ExitBlock(); +} + +void Serializer::EmitInt(uint64_t X) { +  assert (BlockLevel > 0); +  Record.push_back(X); +} + +void Serializer::EmitSInt(int64_t X) { +  if (X >= 0) +    EmitInt(X << 1); +  else +    EmitInt((-X << 1) | 1); +} + +void Serializer::EmitCStr(const char* s, const char* end) { +  Record.push_back(end - s); +   +  while(s != end) { +    Record.push_back(*s); +    ++s; +  } +} + +void Serializer::EmitCStr(const char* s) { +  EmitCStr(s,s+strlen(s)); +} + +SerializedPtrID Serializer::getPtrId(const void* ptr) { +  if (!ptr) +    return 0; +   +  MapTy::iterator I = PtrMap.find(ptr); +   +  if (I == PtrMap.end()) { +    unsigned id = PtrMap.size()+1; +#ifdef DEBUG_BACKPATCH +    llvm::cerr << "Registered PTR: " << ptr << " => " << id << "\n"; +#endif +    PtrMap[ptr] = id; +    return id; +  } +  else return I->second; +} + +bool Serializer::isRegistered(const void* ptr) const { +  MapTy::const_iterator I = PtrMap.find(ptr); +  return I != PtrMap.end(); +} + + +#define INT_EMIT(TYPE)\ +void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitInt(X); } + +INT_EMIT(bool) +INT_EMIT(unsigned char) +INT_EMIT(unsigned short) +INT_EMIT(unsigned int) +INT_EMIT(unsigned long) + +#define SINT_EMIT(TYPE)\ +void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitSInt(X); } + +SINT_EMIT(signed char) +SINT_EMIT(signed short) +SINT_EMIT(signed int) +SINT_EMIT(signed long) | 
