diff options
author | Ted Kremenek <kremenek@apple.com> | 2007-10-31 19:58:32 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2007-10-31 19:58:32 +0000 |
commit | 705770664dcbe808c9be58b68455344a1f4e3121 (patch) | |
tree | 6095483e017ab0eddce1c4017ff519ccafc5c230 /llvm/lib/Bitcode/Reader/Deserialize.cpp | |
parent | 7abb7acafd5e82cfd38b8311b0466c59b5a58f9a (diff) | |
download | bcm5719-llvm-705770664dcbe808c9be58b68455344a1f4e3121.tar.gz bcm5719-llvm-705770664dcbe808c9be58b68455344a1f4e3121.zip |
Implemented deserialization of references. References are handled
just like pointers, except that they cannot be backpatched. This
means that references are essentially non-owning pointers where the
referred object must be deserialized prior to the reference being
deserialized. Because of the nature of references, this ordering of
objects is always possible.
Fixed a bug in backpatching code (returning the backpatched pointer
would accidentally include a bit flag).
llvm-svn: 43570
Diffstat (limited to 'llvm/lib/Bitcode/Reader/Deserialize.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Reader/Deserialize.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/llvm/lib/Bitcode/Reader/Deserialize.cpp b/llvm/lib/Bitcode/Reader/Deserialize.cpp index ff0dd44dc25..4b58cf41dc1 100644 --- a/llvm/lib/Bitcode/Reader/Deserialize.cpp +++ b/llvm/lib/Bitcode/Reader/Deserialize.cpp @@ -115,7 +115,7 @@ void Deserializer::ReadUIntPtr(uintptr_t& PtrRef) { BPatchEntry& E = BPatchMap[PtrId]; if (E.hasFinalPtr()) - PtrRef = E.getRawPtr(); + PtrRef = E.getFinalPtr(); else { // Register backpatch. Check the freelist for a BPNode. BPNode* N; @@ -132,6 +132,18 @@ void Deserializer::ReadUIntPtr(uintptr_t& PtrRef) { } } +uintptr_t Deserializer::ReadInternalRefPtr() { + unsigned PtrId = ReadInt(); + + assert (PtrId != 0 && "References cannot refer the NULL address."); + + BPatchEntry& E = BPatchMap[PtrId]; + + assert (E.hasFinalPtr() && + "Cannot backpatch references. Object must be already deserialized."); + + return E.getFinalPtr(); +} void Deserializer::BPatchEntry::setFinalPtr(BPNode*& FreeList, void* P) { assert (!hasFinalPtr()); |