blob: a6beb1789e1e19b5c6e223e293ff26f33f3e4436 [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"
Chris Lattnerd9ea85a2009-08-23 08:43:55 +000015#include "llvm/Support/raw_ostream.h"
16#include <cstring>
Ted Kremenekec8cd062007-11-08 19:50:46 +000017
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000018using namespace llvm;
19
Ted Kremenek68dd3fb2007-11-06 22:22:25 +000020Serializer::Serializer(BitstreamWriter& stream)
21 : Stream(stream), BlockLevel(0) {}
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000022
23Serializer::~Serializer() {
24 if (inRecord())
25 EmitRecord();
26
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000027 while (BlockLevel > 0)
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000028 Stream.ExitBlock();
Ted Kremenek730c2732007-11-06 19:49:50 +000029
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000030 Stream.FlushToWord();
31}
32
33void Serializer::EmitRecord() {
34 assert(Record.size() > 0 && "Cannot emit empty record.");
35 Stream.EmitRecord(8,Record);
36 Record.clear();
37}
38
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000039void Serializer::EnterBlock(unsigned BlockID,unsigned CodeLen) {
Ted Kremenek730c2732007-11-06 19:49:50 +000040 FlushRecord();
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000041 Stream.EnterSubblock(BlockID,CodeLen);
42 ++BlockLevel;
43}
44
45void Serializer::ExitBlock() {
46 assert (BlockLevel > 0);
47 --BlockLevel;
Ted Kremenek730c2732007-11-06 19:49:50 +000048 FlushRecord();
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000049 Stream.ExitBlock();
50}
51
Ted Kremenek2e6452c2007-11-07 18:24:34 +000052void Serializer::EmitInt(uint64_t X) {
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000053 assert (BlockLevel > 0);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000054 Record.push_back(X);
55}
56
Ted Kremenek2e6452c2007-11-07 18:24:34 +000057void Serializer::EmitSInt(int64_t X) {
58 if (X >= 0)
59 EmitInt(X << 1);
60 else
61 EmitInt((-X << 1) | 1);
62}
63
Ted Kremenek6e9b4962007-10-24 19:06:40 +000064void Serializer::EmitCStr(const char* s, const char* end) {
65 Record.push_back(end - s);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000066
Ted Kremenek6e9b4962007-10-24 19:06:40 +000067 while(s != end) {
68 Record.push_back(*s);
69 ++s;
70 }
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000071}
Ted Kremenek6e9b4962007-10-24 19:06:40 +000072
73void Serializer::EmitCStr(const char* s) {
74 EmitCStr(s,s+strlen(s));
75}
76
Ted Kremenekec8cd062007-11-08 19:50:46 +000077SerializedPtrID Serializer::getPtrId(const void* ptr) {
Ted Kremenek2423e032007-10-25 18:42:52 +000078 if (!ptr)
79 return 0;
80
Ted Kremenekfe2a0122007-10-25 00:10:21 +000081 MapTy::iterator I = PtrMap.find(ptr);
82
83 if (I == PtrMap.end()) {
Ted Kremenek2423e032007-10-25 18:42:52 +000084 unsigned id = PtrMap.size()+1;
Ted Kremenekec8cd062007-11-08 19:50:46 +000085#ifdef DEBUG_BACKPATCH
Chris Lattnerd9ea85a2009-08-23 08:43:55 +000086 errs() << "Registered PTR: " << ptr << " => " << id << "\n";
Ted Kremenekec8cd062007-11-08 19:50:46 +000087#endif
Ted Kremenekfe2a0122007-10-25 00:10:21 +000088 PtrMap[ptr] = id;
89 return id;
90 }
91 else return I->second;
92}
93
Ted Kremenekec8cd062007-11-08 19:50:46 +000094bool Serializer::isRegistered(const void* ptr) const {
95 MapTy::const_iterator I = PtrMap.find(ptr);
96 return I != PtrMap.end();
97}
98
Ted Kremenek0a6d98e2007-11-05 21:36:35 +000099
Ted Kremenek6e9b4962007-10-24 19:06:40 +0000100#define INT_EMIT(TYPE)\
101void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitInt(X); }
102
103INT_EMIT(bool)
104INT_EMIT(unsigned char)
105INT_EMIT(unsigned short)
106INT_EMIT(unsigned int)
107INT_EMIT(unsigned long)
Ted Kremenek2e6452c2007-11-07 18:24:34 +0000108
109#define SINT_EMIT(TYPE)\
110void SerializeTrait<TYPE>::Emit(Serializer&S, TYPE X) { S.EmitSInt(X); }
111
112SINT_EMIT(signed char)
113SINT_EMIT(signed short)
114SINT_EMIT(signed int)
115SINT_EMIT(signed long)