blob: cf5fe205eba4faae7aa12c93d84573160764890b [file] [log] [blame]
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +00001//==- Deserialize.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/Deserialize.h"
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000015
16using namespace llvm;
17
18Deserializer::Deserializer(BitstreamReader& stream)
19 : Stream(stream), RecIdx(0) {
20}
21
22Deserializer::~Deserializer() {
23 assert (RecIdx >= Record.size() &&
24 "Still scanning bitcode record when deserialization completed.");
25}
26
27void Deserializer::ReadRecord() {
28 // FIXME: Check if we haven't run off the edge of the stream.
29 // FIXME: Handle abbreviations.
Ted Kremenek6e9b4962007-10-24 19:06:40 +000030
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000031 // FIXME: Check for the correct code.
Ted Kremenek6e9b4962007-10-24 19:06:40 +000032 unsigned Code = Stream.ReadCode();
33
34 assert (Record.size() == 0);
35 Stream.ReadRecord(Code,Record);
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000036 assert (Record.size() > 0);
37}
38
Ted Kremenek6e9b4962007-10-24 19:06:40 +000039uint64_t Deserializer::ReadInt() {
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000040 // FIXME: Any error recovery/handling with incomplete or bad files?
41 if (!inRecord())
42 ReadRecord();
43
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000044 return Record[RecIdx++];
45}
46
Ted Kremenek6e9b4962007-10-24 19:06:40 +000047char* Deserializer::ReadCStr(char* cstr, unsigned MaxLen, bool isNullTerm) {
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000048 if (cstr == NULL)
49 MaxLen = 0; // Zero this just in case someone does something funny.
50
Ted Kremenek6e9b4962007-10-24 19:06:40 +000051 unsigned len = ReadInt();
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000052
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000053 assert (MaxLen == 0 || (len + (isNullTerm ? 1 : 0)) <= MaxLen);
54
55 if (!cstr)
56 cstr = new char[len + (isNullTerm ? 1 : 0)];
57
58 assert (cstr != NULL);
59
60 for (unsigned i = 0; i < len; ++i)
Ted Kremenek6e9b4962007-10-24 19:06:40 +000061 cstr[i] = (char) ReadInt();
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000062
63 if (isNullTerm)
64 cstr[len+1] = '\0';
65
66 return cstr;
67}
68
Ted Kremenek6e9b4962007-10-24 19:06:40 +000069void Deserializer::ReadCStr(std::vector<char>& buff, bool isNullTerm) {
70 unsigned len = ReadInt();
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000071
Ted Kremenek6e9b4962007-10-24 19:06:40 +000072 buff.clear();
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000073 buff.reserve(len);
74
75 for (unsigned i = 0; i < len; ++i)
Ted Kremenek6e9b4962007-10-24 19:06:40 +000076 buff.push_back((char) ReadInt());
Ted Kremenek0b2d7aa2007-10-23 21:29:33 +000077
78 if (isNullTerm)
79 buff.push_back('\0');
80}
Ted Kremenek6e9b4962007-10-24 19:06:40 +000081
82
83#define INT_READ(TYPE)\
84void SerializeTrait<TYPE>::Read(Deserializer& D, TYPE& X) {\
85 X = (TYPE) D.ReadInt(); }
86
87INT_READ(bool)
88INT_READ(unsigned char)
89INT_READ(unsigned short)
90INT_READ(unsigned int)
91INT_READ(unsigned long)
92INT_READ(unsigned long long)