blob: 72939334bc2fa80960a8bc520829f8e0fb336380 [file] [log] [blame]
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +00001//==- Serialize.cpp - Generic Object Serialization to Bitcode ----*- C++ -*-==//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Ted Kremenek and is distributed under the
6// University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the internal methods used for object serialization.
11//
12//===----------------------------------------------------------------------===//
13
Ted Kremenek6e9b4962007-10-24 19:06:40 +000014#include "llvm/Bitcode/Serialize.h"
15#include "string.h"
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000016
17using namespace llvm;
18
19Serializer::Serializer(BitstreamWriter& stream, unsigned BlockID)
20 : Stream(stream), inBlock(BlockID >= 8) {
21
22 if (inBlock) Stream.EnterSubblock(8,3);
23}
24
25Serializer::~Serializer() {
26 if (inRecord())
27 EmitRecord();
28
29 if (inBlock)
30 Stream.ExitBlock();
31
32 Stream.FlushToWord();
33}
34
35void Serializer::EmitRecord() {
36 assert(Record.size() > 0 && "Cannot emit empty record.");
37 Stream.EmitRecord(8,Record);
38 Record.clear();
39}
40
Ted Kremenek6e9b4962007-10-24 19:06:40 +000041void Serializer::EmitInt(unsigned X) {
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000042 Record.push_back(X);
43}
44
Ted Kremenek6e9b4962007-10-24 19:06:40 +000045void Serializer::EmitCStr(const char* s, const char* end) {
46 Record.push_back(end - s);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000047
Ted Kremenek6e9b4962007-10-24 19:06:40 +000048 while(s != end) {
49 Record.push_back(*s);
50 ++s;
51 }
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000052
53 EmitRecord();
54}
Ted Kremenek6e9b4962007-10-24 19:06:40 +000055
56void Serializer::EmitCStr(const char* s) {
57 EmitCStr(s,s+strlen(s));
58}
59
60#define INT_EMIT(TYPE)\
61void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitInt(X); }
62
63INT_EMIT(bool)
64INT_EMIT(unsigned char)
65INT_EMIT(unsigned short)
66INT_EMIT(unsigned int)
67INT_EMIT(unsigned long)
68INT_EMIT(unsigned long long)