blob: 79464a61be46ae0dde61331cc794f9e112b1d04a [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//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +00007//
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
Ted Kremenekec8cd062007-11-08 19:50:46 +000017#ifdef DEBUG_BACKPATCH
18#include "llvm/Support/Streams.h"
19#endif
20
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000021using namespace llvm;
22
Ted Kremenek68dd3fb2007-11-06 22:22:25 +000023Serializer::Serializer(BitstreamWriter& stream)
24 : Stream(stream), BlockLevel(0) {}
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000025
26Serializer::~Serializer() {
27 if (inRecord())
28 EmitRecord();
29
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000030 while (BlockLevel > 0)
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000031 Stream.ExitBlock();
Ted Kremenek730c2732007-11-06 19:49:50 +000032
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000033 Stream.FlushToWord();
34}
35
36void Serializer::EmitRecord() {
37 assert(Record.size() > 0 && "Cannot emit empty record.");
38 Stream.EmitRecord(8,Record);
39 Record.clear();
40}
41
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000042void Serializer::EnterBlock(unsigned BlockID,unsigned CodeLen) {
Ted Kremenek730c2732007-11-06 19:49:50 +000043 FlushRecord();
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000044 Stream.EnterSubblock(BlockID,CodeLen);
45 ++BlockLevel;
46}
47
48void Serializer::ExitBlock() {
49 assert (BlockLevel > 0);
50 --BlockLevel;
Ted Kremenek730c2732007-11-06 19:49:50 +000051 FlushRecord();
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000052 Stream.ExitBlock();
53}
54
Ted Kremenek2e6452c2007-11-07 18:24:34 +000055void Serializer::EmitInt(uint64_t X) {
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000056 assert (BlockLevel > 0);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000057 Record.push_back(X);
58}
59
Ted Kremenek2e6452c2007-11-07 18:24:34 +000060void Serializer::EmitSInt(int64_t X) {
61 if (X >= 0)
62 EmitInt(X << 1);
63 else
64 EmitInt((-X << 1) | 1);
65}
66
Ted Kremenek6e9b4962007-10-24 19:06:40 +000067void Serializer::EmitCStr(const char* s, const char* end) {
68 Record.push_back(end - s);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000069
Ted Kremenek6e9b4962007-10-24 19:06:40 +000070 while(s != end) {
71 Record.push_back(*s);
72 ++s;
73 }
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000074}
Ted Kremenek6e9b4962007-10-24 19:06:40 +000075
76void Serializer::EmitCStr(const char* s) {
77 EmitCStr(s,s+strlen(s));
78}
79
Ted Kremenekec8cd062007-11-08 19:50:46 +000080SerializedPtrID Serializer::getPtrId(const void* ptr) {
Ted Kremenek2423e032007-10-25 18:42:52 +000081 if (!ptr)
82 return 0;
83
Ted Kremenekfe2a0122007-10-25 00:10:21 +000084 MapTy::iterator I = PtrMap.find(ptr);
85
86 if (I == PtrMap.end()) {
Ted Kremenek2423e032007-10-25 18:42:52 +000087 unsigned id = PtrMap.size()+1;
Ted Kremenekec8cd062007-11-08 19:50:46 +000088#ifdef DEBUG_BACKPATCH
89 llvm::cerr << "Registered PTR: " << ptr << " => " << id << "\n";
90#endif
Ted Kremenekfe2a0122007-10-25 00:10:21 +000091 PtrMap[ptr] = id;
92 return id;
93 }
94 else return I->second;
95}
96
Ted Kremenekec8cd062007-11-08 19:50:46 +000097bool Serializer::isRegistered(const void* ptr) const {
98 MapTy::const_iterator I = PtrMap.find(ptr);
99 return I != PtrMap.end();
100}
101
Ted Kremenek0a6d98e2007-11-05 21:36:35 +0000102
Ted Kremenek6e9b4962007-10-24 19:06:40 +0000103#define INT_EMIT(TYPE)\
104void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitInt(X); }
105
106INT_EMIT(bool)
107INT_EMIT(unsigned char)
108INT_EMIT(unsigned short)
109INT_EMIT(unsigned int)
110INT_EMIT(unsigned long)
Ted Kremenek2e6452c2007-11-07 18:24:34 +0000111
112#define SINT_EMIT(TYPE)\
113void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitSInt(X); }
114
115SINT_EMIT(signed char)
116SINT_EMIT(signed short)
117SINT_EMIT(signed int)
118SINT_EMIT(signed long)