blob: 58baf104c7a0299abc2e950ea0e983aa2b9df783 [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
Ted Kremenek8aac61c2007-10-31 18:23:21 +000060unsigned Serializer::getPtrId(const void* ptr) {
Ted Kremenek2423e032007-10-25 18:42:52 +000061 if (!ptr)
62 return 0;
63
Ted Kremenekfe2a0122007-10-25 00:10:21 +000064 MapTy::iterator I = PtrMap.find(ptr);
65
66 if (I == PtrMap.end()) {
Ted Kremenek2423e032007-10-25 18:42:52 +000067 unsigned id = PtrMap.size()+1;
Ted Kremenekfe2a0122007-10-25 00:10:21 +000068 PtrMap[ptr] = id;
69 return id;
70 }
71 else return I->second;
72}
73
Ted Kremenek6e9b4962007-10-24 19:06:40 +000074#define INT_EMIT(TYPE)\
75void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitInt(X); }
76
77INT_EMIT(bool)
78INT_EMIT(unsigned char)
79INT_EMIT(unsigned short)
80INT_EMIT(unsigned int)
81INT_EMIT(unsigned long)