blob: 4395b90a89dd90941fe6894853e5eb5916a046ee [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 Kremenek6e9b4962007-10-24 19:06:40 +000051void Serializer::EmitInt(unsigned 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 Kremenek6e9b4962007-10-24 19:06:40 +000056void Serializer::EmitCStr(const char* s, const char* end) {
57 Record.push_back(end - s);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000058
Ted Kremenek6e9b4962007-10-24 19:06:40 +000059 while(s != end) {
60 Record.push_back(*s);
61 ++s;
62 }
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000063
64 EmitRecord();
65}
Ted Kremenek6e9b4962007-10-24 19:06:40 +000066
67void Serializer::EmitCStr(const char* s) {
68 EmitCStr(s,s+strlen(s));
69}
70
Ted Kremenek8aac61c2007-10-31 18:23:21 +000071unsigned Serializer::getPtrId(const void* ptr) {
Ted Kremenek2423e032007-10-25 18:42:52 +000072 if (!ptr)
73 return 0;
74
Ted Kremenekfe2a0122007-10-25 00:10:21 +000075 MapTy::iterator I = PtrMap.find(ptr);
76
77 if (I == PtrMap.end()) {
Ted Kremenek2423e032007-10-25 18:42:52 +000078 unsigned id = PtrMap.size()+1;
Ted Kremenekfe2a0122007-10-25 00:10:21 +000079 PtrMap[ptr] = id;
80 return id;
81 }
82 else return I->second;
83}
84
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000085
Ted Kremenek6e9b4962007-10-24 19:06:40 +000086#define INT_EMIT(TYPE)\
87void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitInt(X); }
88
89INT_EMIT(bool)
90INT_EMIT(unsigned char)
91INT_EMIT(unsigned short)
92INT_EMIT(unsigned int)
93INT_EMIT(unsigned long)