blob: b97462b629e1b7d71bdd39e2bf8e4976f6e03b23 [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
Ted Kremenek68dd3fb2007-11-06 22:22:25 +000019Serializer::Serializer(BitstreamWriter& stream)
20 : Stream(stream), BlockLevel(0) {}
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000021
22Serializer::~Serializer() {
23 if (inRecord())
24 EmitRecord();
25
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000026 while (BlockLevel > 0)
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000027 Stream.ExitBlock();
Ted Kremenek730c2732007-11-06 19:49:50 +000028
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000029 Stream.FlushToWord();
30}
31
32void Serializer::EmitRecord() {
33 assert(Record.size() > 0 && "Cannot emit empty record.");
34 Stream.EmitRecord(8,Record);
35 Record.clear();
36}
37
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000038void Serializer::EnterBlock(unsigned BlockID,unsigned CodeLen) {
Ted Kremenek730c2732007-11-06 19:49:50 +000039 FlushRecord();
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000040 Stream.EnterSubblock(BlockID,CodeLen);
41 ++BlockLevel;
42}
43
44void Serializer::ExitBlock() {
45 assert (BlockLevel > 0);
46 --BlockLevel;
Ted Kremenek730c2732007-11-06 19:49:50 +000047 FlushRecord();
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000048 Stream.ExitBlock();
49}
50
Ted Kremenek2e6452c2007-11-07 18:24:34 +000051void Serializer::EmitInt(uint64_t X) {
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000052 assert (BlockLevel > 0);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000053 Record.push_back(X);
54}
55
Ted Kremenek2e6452c2007-11-07 18:24:34 +000056void Serializer::EmitSInt(int64_t X) {
57 if (X >= 0)
58 EmitInt(X << 1);
59 else
60 EmitInt((-X << 1) | 1);
61}
62
Ted Kremenek6e9b4962007-10-24 19:06:40 +000063void Serializer::EmitCStr(const char* s, const char* end) {
64 Record.push_back(end - s);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000065
Ted Kremenek6e9b4962007-10-24 19:06:40 +000066 while(s != end) {
67 Record.push_back(*s);
68 ++s;
69 }
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000070
71 EmitRecord();
72}
Ted Kremenek6e9b4962007-10-24 19:06:40 +000073
74void Serializer::EmitCStr(const char* s) {
75 EmitCStr(s,s+strlen(s));
76}
77
Ted Kremenek8aac61c2007-10-31 18:23:21 +000078unsigned Serializer::getPtrId(const void* ptr) {
Ted Kremenek2423e032007-10-25 18:42:52 +000079 if (!ptr)
80 return 0;
81
Ted Kremenekfe2a0122007-10-25 00:10:21 +000082 MapTy::iterator I = PtrMap.find(ptr);
83
84 if (I == PtrMap.end()) {
Ted Kremenek2423e032007-10-25 18:42:52 +000085 unsigned id = PtrMap.size()+1;
Ted Kremenekfe2a0122007-10-25 00:10:21 +000086 PtrMap[ptr] = id;
87 return id;
88 }
89 else return I->second;
90}
91
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000092
Ted Kremenek6e9b4962007-10-24 19:06:40 +000093#define INT_EMIT(TYPE)\
94void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitInt(X); }
95
96INT_EMIT(bool)
97INT_EMIT(unsigned char)
98INT_EMIT(unsigned short)
99INT_EMIT(unsigned int)
100INT_EMIT(unsigned long)
Ted Kremenek2e6452c2007-11-07 18:24:34 +0000101
102#define SINT_EMIT(TYPE)\
103void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitSInt(X); }
104
105SINT_EMIT(signed char)
106SINT_EMIT(signed short)
107SINT_EMIT(signed int)
108SINT_EMIT(signed long)