diff options
author | Ted Kremenek <kremenek@apple.com> | 2007-10-25 00:10:21 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2007-10-25 00:10:21 +0000 |
commit | fe2a0123389adf0f2f66c413570d2daabdb5539d (patch) | |
tree | 43b79768756f6e621a013424fb535c458a85f16c /lib/Bitcode/Reader | |
parent | 8eadd5a6db79da067c773d1bd1cc13edc07788cc (diff) |
Implemented prototype serialization of pointers, including support
for backpatching.
Added Deserialize::ReadVal.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43319 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode/Reader')
-rw-r--r-- | lib/Bitcode/Reader/Deserialize.cpp | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/lib/Bitcode/Reader/Deserialize.cpp b/lib/Bitcode/Reader/Deserialize.cpp index cf5fe205eb..febb2d7caf 100644 --- a/lib/Bitcode/Reader/Deserialize.cpp +++ b/lib/Bitcode/Reader/Deserialize.cpp @@ -22,6 +22,21 @@ Deserializer::Deserializer(BitstreamReader& stream) Deserializer::~Deserializer() { assert (RecIdx >= Record.size() && "Still scanning bitcode record when deserialization completed."); + + BackpatchPointers(); +} + + +bool Deserializer::inRecord() { + if (Record.size() > 0) { + if (RecIdx >= Record.size()) { + RecIdx = 0; + Record.clear(); + return false; + } + else return true; + } + else return false; } void Deserializer::ReadRecord() { @@ -79,14 +94,49 @@ void Deserializer::ReadCStr(std::vector<char>& buff, bool isNullTerm) { buff.push_back('\0'); } +void Deserializer::RegisterPtr(unsigned PtrId,void* Ptr) { + BPatchEntry& E = BPatchMap[PtrId]; + assert (E.Ptr == NULL && "Pointer already registered."); + E.Ptr = Ptr; +} + +void Deserializer::ReadPtr(void*& PtrRef) { + unsigned PtrId = ReadInt(); + + BPatchEntry& E = BPatchMap[PtrId]; + + if (E.Ptr == NULL) { + // Register backpatch. + void* P = Allocator.Allocate<BPatchNode>(); + E.Head = new (P) BPatchNode(E.Head,PtrRef); + } + else + PtrRef = E.Ptr; +} + +void Deserializer::BackpatchPointers() { + for (MapTy::iterator I=BPatchMap.begin(),E=BPatchMap.end(); I!=E; ++I) { + + BPatchEntry& E = I->second; + assert (E.Ptr && "No pointer found for backpatch."); + + for (BPatchNode* N = E.Head; N != NULL; N = N->Next) + N->PtrRef = E.Ptr; + + E.Head = NULL; + } + + Allocator.Reset(); +} #define INT_READ(TYPE)\ void SerializeTrait<TYPE>::Read(Deserializer& D, TYPE& X) {\ - X = (TYPE) D.ReadInt(); } + X = (TYPE) D.ReadInt(); }\ +TYPE SerializeTrait<TYPE>::ReadVal(Deserializer& D) {\ + return (TYPE) D.ReadInt(); } INT_READ(bool) INT_READ(unsigned char) INT_READ(unsigned short) INT_READ(unsigned int) INT_READ(unsigned long) -INT_READ(unsigned long long) |