blob: 8e3bb1b1aad128b74071e099e0b97080e70fb068 [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)
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000020 : Stream(stream), BlockLevel(0) {
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000021
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000022 if (BlockID >= 8)
23 EnterBlock(8,3);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000024}
25
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 Kremenek6e9b4962007-10-24 19:06:40 +000055void Serializer::EmitInt(unsigned 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 Kremenek6e9b4962007-10-24 19:06:40 +000060void Serializer::EmitCStr(const char* s, const char* end) {
61 Record.push_back(end - s);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000062
Ted Kremenek6e9b4962007-10-24 19:06:40 +000063 while(s != end) {
64 Record.push_back(*s);
65 ++s;
66 }
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000067
68 EmitRecord();
69}
Ted Kremenek6e9b4962007-10-24 19:06:40 +000070
71void Serializer::EmitCStr(const char* s) {
72 EmitCStr(s,s+strlen(s));
73}
74
Ted Kremenek8aac61c2007-10-31 18:23:21 +000075unsigned Serializer::getPtrId(const void* ptr) {
Ted Kremenek2423e032007-10-25 18:42:52 +000076 if (!ptr)
77 return 0;
78
Ted Kremenekfe2a0122007-10-25 00:10:21 +000079 MapTy::iterator I = PtrMap.find(ptr);
80
81 if (I == PtrMap.end()) {
Ted Kremenek2423e032007-10-25 18:42:52 +000082 unsigned id = PtrMap.size()+1;
Ted Kremenekfe2a0122007-10-25 00:10:21 +000083 PtrMap[ptr] = id;
84 return id;
85 }
86 else return I->second;
87}
88
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000089
Ted Kremenek6e9b4962007-10-24 19:06:40 +000090#define INT_EMIT(TYPE)\
91void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitInt(X); }
92
93INT_EMIT(bool)
94INT_EMIT(unsigned char)
95INT_EMIT(unsigned short)
96INT_EMIT(unsigned int)
97INT_EMIT(unsigned long)